如何用另一个列表中的对象的属性创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 }
如果您有其他问题,请评论/更新问题,我们会尽力帮助您。