想象一下,我有一些对象的列表:
List<Student>
我需要生成包含另一个列表ids
的Students
在上面的列表:
List<Integer>
避免使用循环,是否可以通过使用apache collections或guava来实现?
哪种方法对我的情况有用?
想象一下,我有一些对象的列表:
List<Student>
我需要生成包含另一个列表ids
的Students
在上面的列表:
List<Integer>
避免使用循环,是否可以通过使用apache collections或guava来实现?
哪种方法对我的情况有用?
Answers:
使用番石榴,您可以使用功能,例如-
private enum StudentToId implements Function<Student, Integer> {
INSTANCE;
@Override
public Integer apply(Student input) {
return input.getId();
}
}
您可以使用此功能将学生名单转换为-
Lists.transform(studentList, StudentToId.INSTANCE);
当然它将循环以提取所有id,但是请记住guava方法返回view,并且仅当您尝试遍历时才应用Function。List<Integer>
如果不进行迭代,它将永远不会应用循环。
注意:请记住,这是观点,如果你想要遍历多次,这将是更好的内容在其他一些复制List<Integer>
像
ImmutableList.copyOf(Iterables.transform(students, StudentToId.INSTANCE));
感谢Premraj推荐的替代酷选项。
我已经使用了Apache CollectionUtils和BeanUtils。因此,我对以下代码的性能感到满意:
List<Long> idList = (List<Long>) CollectionUtils.collect(objectList,
new BeanToPropertyValueTransformer("id"));
值得一提的是,我将比较上面使用的番石榴(提供的Premraj)和collectionUtils的性能,并确定速度更快的一种。
Identifiable
定义getId()
方法的接口,然后可以使用此单个枚举单例模式来通常提取ID。
Java 8 Lambda表达式解决方案:
List<Integer> iDList = students.stream().map((student) -> student.getId()).collect(Collectors.toList());
从数学上讲,没有循环就不可能做到这一点。为了创建一组离散值到另一组离散值的映射F,F必须对原始组中的每个元素进行操作。(执行此操作基本上需要一个循环。)
话虽如此:
为什么需要新清单?您可能会以错误的方式来解决任何问题。
如果您有的列表Student
,则在遍历此列表时,只需遍历一两步即可遍历学生的ID号。
for(Student s : list)
{
int current_id = s.getID();
// Do something with current_id
}
如果您有其他问题,请评论/更新问题,我们将尽力为您提供帮助。