想象一下,我有一个特定对象的列表:
List<Student>
我需要生成另一个列表,包括上面列表中的ids
of :Students
List<Integer>
避免使用循环,是否可以通过使用apache 集合或guava来实现这一点?
哪些方法应该对我的情况有用?
想象一下,我有一个特定对象的列表:
List<Student>
我需要生成另一个列表,包括上面列表中的ids
of :Students
List<Integer>
避免使用循环,是否可以通过使用apache 集合或guava来实现这一点?
哪些方法应该对我的情况有用?
Java 8 的做法:-
List<Integer> idList = students.stream().map(Student::getId).collect(Collectors.toList());
使用 Guava,您可以使用以下功能 -
private enum StudentToId implements Function<Student, Integer> {
INSTANCE;
@Override
public Integer apply(Student input) {
return input.getId();
}
}
您可以使用此功能将学生列表转换为 id,例如 -
Lists.transform(studentList, StudentToId.INSTANCE);
它肯定会循环以提取所有 id,但请记住 guava 方法返回视图,并且仅在您尝试迭代时应用 FunctionList<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"));
值得一提的是,我将比较我上面使用的 guava(Premraj提供)和 collectionUtils 的性能,并决定哪个更快。
Java 8 lambda 表达式解决方案:
List<Integer> iDList = students.stream().map((student) -> student.getId()).collect(Collectors.toList());
如果有人在几年后来到这里:
List<String> stringProperty = (List<String>) CollectionUtils.collect(listOfBeans, TransformerUtils.invokerTransformer("getProperty"));
您可以为此目的使用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]
如果没有循环,在数学上是不可能做到这一点的。为了创建一个离散值集到另一个离散值集的映射 F,F 必须对原始集中的每个元素进行操作。(基本上,需要一个循环来执行此操作。)
话虽如此:
为什么需要新列表?您可能正在以错误的方式解决您正在解决的任何问题。
如果您有 的列表Student
,那么在遍历此列表时,您只需一两步即可遍历学生的 ID 号。
for(Student s : list)
{
int current_id = s.getID();
// Do something with current_id
}
如果您有其他类型的问题,请评论/更新问题,我们会尽力帮助您。