![](/img/trans.png)
[英]Java, Hibernate, How to set Envers, so it won't create new versions if only one one field changed?
[英]Create new List in Java extracting only one field
我有以下课程:
public class Person {
private Integer id;
private String name;
private String address;
...
}
在代码的特定位置,我建立了一个Person列表:
List<Person> people = getPeople();
我需要的是仅使用原始列表的字段id
创建一个新列表。 当然,我可以遍历列表并创建一个新列表:
List<Integer> idsList = new ArrayList<Integer>();
for (Person person: people){
idsList.add(person.getId());
}
但是我想知道是否有一种方法可以不进行迭代。
我正在使用JDK6。
提前非常感谢你
这取决于您需要使用List
做什么。 如果您很高兴能够查看无法直接修改的原始列表的ID,则可以执行以下操作:
public static List<Integer> idList(final List<Person> people) {
return new AbstractList<Integer>() {
@Override
public Integer get(int index) {
return people.get(index).getId();
}
@Override
public int size() {
return people.size();
}
};
}
如果您需要ID的ArrayList
,则必须进行迭代。
在Java8中:
List<Person> people = getPeople();
List<Integer> ids = people.stream()
.map(Person::getId)
.collect(Collectors.toList());
抱歉,尚未注意到JDK版本。
对于J6 + Guava,它将是:
List<Person> people = getPeople();
List<Integer> ids = FluentIterable.from(people)
.transform(new Function<Person, Integer>() {
@Override
public Integer apply(Person person) {
return person.getId();
}
}).toList();
您显然可以将Function提取到某个静态变量中,以使其更加清晰。
private static final Function<Person, Integer> TO_ID = new Function<Person, Integer>() {
@Override public Integer apply(Person person) {
return person.getId();
}
};
public static void main(String [] args) {
List<Person> people = getPeople();
List<Integer> ids = FluentIterable.from(people)
.transform(TO_ID)
.toList();
}
只是在这里倾销想法。
当代码将人员对象添加到列表中时,为什么不直接将id添加到列表中呢? 这样一来,您的ID列表就可以即时维护,而您又不必遍历人员列表来最后创建ID列表呢?
如果我没有完全理解您的问题,请告诉我
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.