如何使用另一个列表中的对象的属性创建新列表

时间:2012-06-11 07:20:28

标签: java list collections guava

想象一下,我有一些特定对象的列表:

List<Student>

我需要在上面的列表中生成另一个包含ids Students的列表:

List<Integer>

避免使用循环,是否可以通过使用 apache集合 guava 来实现此目的?

哪些方法对我的案例有用?

7 个答案:

答案 0 :(得分:144)

Java 8的做法: -

List<Integer> idList = students.stream().map(Student::getId).collect(Collectors.toList());

答案 1 :(得分:38)

使用Guava,你可以使用像 -

这样的函数
private enum StudentToId implements Function<Student, Integer> {
        INSTANCE;

        @Override
        public Integer apply(Student input) {
            return input.getId();
        }
    }

您可以使用此功能将学生列表转换为像< - p>这样的ID

Lists.transform(studentList, StudentToId.INSTANCE);

肯定会循环以提取所有ID,但请记住guava方法返回视图,只有在尝试迭代List<Integer>时才会应用Function 如果不进行迭代,则永远不会应用循环。

注意:请记住这是视图,如果您想多次迭代,最好将内容复制到其他List<Integer>

ImmutableList.copyOf(Iterables.transform(students, StudentToId.INSTANCE));

答案 2 :(得分:21)

感谢 Premraj 替代酷炫选项,upvoted。

我使用过apache CollectionUtils和BeanUtils。因此,我对以下代码的表现感到满意:

List<Long> idList = (List<Long>) CollectionUtils.collect(objectList, 
                                    new BeanToPropertyValueTransformer("id"));

值得一提的是,我将比较上面使用的番石榴( Premraj 提供)和collectionUtils的性能,并决定速度更快。

答案 3 :(得分:6)

Java 8 lambda表达式解决方案:

List<Integer> iDList = students.stream().map((student) -> student.getId()).collect(Collectors.toList());

答案 4 :(得分:4)

如果有人在几年后来到这里:

List<String> stringProperty = (List<String>) CollectionUtils.collect(listOfBeans, TransformerUtils.invokerTransformer("getProperty"));

答案 5 :(得分:0)

您可以为此使用 Eclipse Collections

Student first = new Student(1);
Student second = new Student(2);
Student third = new Student(3);

MutableList<Student> list = Lists.mutable.of(first, second, third);
List<Integer> result = list.collect(Student::getId);

System.out.println(result); // [1, 2, 3]

答案 6 :(得分:-5)

没有循环,在数学上不可能做到这一点。为了创建一组离散值到另一个离散值集的映射F,F必须对起始集中的每个元素进行操作。 (基本上,这需要一个循环。)

话虽如此:

为什么需要新的清单?你可能会以错误的方式接近你正在解决的任何问题。

如果你有Student的列表,那么在迭代这个列表时,你只需要一两步就可以迭代I.D.学生人数。

for(Student s : list)
{
    int current_id = s.getID();
    // Do something with current_id
}

如果您遇到其他类型的问题,请发表评论/更新问题,我们会尽力为您提供帮助。