【发布时间】:2013-12-03 18:09:49
【问题描述】:
假设我有一个对象 User 的 ArrayList,所以 ArrayList<user>。一个用户对象有一个属性userID。
与其自己迭代列表并将用户 ID 添加到单独的列表中,是否有 API 调用可以将我想要的该对象上的属性传递给它,并将这些属性的列表返回给我?浏览了 API 并没有什么突出的。
在 Java 7 中寻找解决方案或 <.>
【问题讨论】:
假设我有一个对象 User 的 ArrayList,所以 ArrayList<user>。一个用户对象有一个属性userID。
与其自己迭代列表并将用户 ID 添加到单独的列表中,是否有 API 调用可以将我想要的该对象上的属性传递给它,并将这些属性的列表返回给我?浏览了 API 并没有什么突出的。
在 Java 7 中寻找解决方案或 <.>
【问题讨论】:
您可以使用lambdas expressions (Java 8) 来做到这一点:
import java.util.*;
import java.util.function.*;
import java.util.stream.*;
public class Test {
public static void main(String args[]){
List<User> users = Arrays.asList(new User(1,"Alice"), new User(2,"Bob"), new User(3,"Charlie"), new User(4,"Dave"));
List<Long> listUsersId = users.stream()
.map(u -> u.id)
.collect(Collectors.toList());
System.out.println(listUsersId);
}
}
class User {
public long id;
public String name;
public User(long id, String name){
this.id = id;
this.name = name;
}
}
输出:
[1, 2, 3, 4]
片段here.
public class Test {
public static void main (String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
List<User> users = Arrays.asList(new User(1,"Alice"), new User(2,"Bob"), new User(3,"Charlie"), new User(4,"Dave"));
List<Object> list = get(users,"id");
System.out.println(list);
}
public static List<Object> get(List<User> l, String fieldName) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
Field field = User.class.getDeclaredField(fieldName);
field.setAccessible(true);
List<Object> list = new ArrayList<>();
for(User u : l){
list.add(field.get(u));
}
field.setAccessible(false);
return list;
}
}
class User {
private long id;
private String name;
public User(long id, String name){
this.id = id;
this.name = name;
}
}
输出:
[1, 2, 3, 4]
【讨论】:
List<Object> get(List<User> l, String fieldName) 之类的东西?
您可以使用 Guava 的 Collections2#transform 方法获得相同的结果。
List<Integer> userIDs = Collections2.transform(users, new Function<User, Integer> (){
public Integer apply(User user) {
return user.getUserID();
}
});
Guava 支持 Java 7 及更低版本,因此如果您想使用外部库,上述方法适用于您的情况。
不幸的是,您将不得不对您可能拥有的任何其他对象及其内部字段执行类似的逻辑。它不像反射那样是一种通用的解决方案,它只是一种更紧凑的解决方案。
【讨论】:
【讨论】: