假设我有这门课.
class People {
private String name;
private int age;
/** other stuff constructor / getters / setters / etc. **/
}
Run Code Online (Sandbox Code Playgroud)
让我们说我有这个清单:
List<People> people = Arrays.asList(new People("Mark", 21), new People("Bob",17), new People("Alex", 22));
Run Code Online (Sandbox Code Playgroud)
现在我希望能够获得List特定属性的所有用户.
使用Java 8,我可以创建一个接受我想要的函数的方法:
public static <X, Y> List<Y> processElements(Iterable<X> source, Function <X, Y> mapper) {
List<Y> l = new ArrayList<>();
for (X p : source)
l.add(mapper.apply(p));
return l;
}
Run Code Online (Sandbox Code Playgroud)
然后我将能够执行一些调用:
List<String> listNames = processElements(people, p -> p.getName());
List<Integer> listAges = processElements(people, p -> p.getAge());
Run Code Online (Sandbox Code Playgroud)
然而,这在Java 7中是不可能的(我知道它存在于Guava中,但我只想使用JDK来提出解决方案).
这是我用反射得到的:
public static List<Object> processElements(List<People> l, String fieldName) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
Field field = People.class.getDeclaredField(fieldName);
field.setAccessible(true);
List<Object> list = new ArrayList<>();
for(People p : l){
list.add(field.get(p));
}
field.setAccessible(false);
return list;
}
Run Code Online (Sandbox Code Playgroud)
现在我可以做一些List<Object> listNames = processElements(people, "name");非常有效的事情.
但我觉得不舒服:
List<Object>field.setAccessible(true);不是很安全所以我的问题是:
谢谢
您可以使用Java 7的匿名类完成与Java 8相同的操作
public static <X, Y> List<Y> processElements(Iterable<X> source, Function <X, Y> mapper) {
List<Y> l = new ArrayList<>();
for (X p : source)
l.add(mapper.apply(p));
return l;
}
List<String> listNames = processElements(people, new Function<People, String>() {
public String apply(People person) {
return person.getName();
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
95 次 |
| 最近记录: |