繁体   English   中英

用Java创建新列表仅提取一个字段

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM