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

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

List<Student> 

而且我需要在上面的列表中生成另一个包括学生ID的列表:

 List<Integer> 

避免使用循环,是否有可能通过使用Apache集合番石榴来实现这一点? 哪些方法应该对我的情况有用?

任何帮助将不胜感激,谢谢。

Java 8的做法: –

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

番石榴,你可以使用function像 –

 private enum StudentToId implements Function<Student, Integer> { INSTANCE; @Override public Integer apply(Student input) { return input.getId(); } } 

您可以使用此function将学生列表转换为ID –

 Lists.transform(studentList, StudentToId.INSTANCE); 

当然,它会循环,以提取所有的ID,但记住番石榴方法返回视图和函数将只适用于当您尝试迭代List<Integer>
如果你不迭代,它将永远不会应用循环。

注意:记住这是视图,如果你想迭代多次,最好是复制一些其他List<Integer>的内容

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

感谢Premraj替代酷选项,upvoted。

我已经使用apache的CollectionUtils和BeanUtils。 因此,我对以下代码的执行感到满意:

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

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

Java 8 lambdaexpression式解决scheme:

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

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

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

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

话虽如此:

为什么你需要一个新的名单? 你可以用错误的方式来解决你正在解决的任何问题。

如果你有一个Student列表,那么在遍历这个列表的时候,你只需要走一两步,从迭代学生的ID号码开始。

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

如果您有其他问题,请评论/更新问题,我们会尽力帮助您。