想象一下,我有一些特定对象的列表:
List<Student>
我需要在上面的列表中生成另一个包含ids
Students
的列表:
List<Integer>
避免使用循环,是否可以通过使用 apache集合或 guava 来实现此目的?
哪些方法对我的案例有用?
答案 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
}
如果您遇到其他类型的问题,请发表评论/更新问题,我们会尽力为您提供帮助。