如何从另一个List<Object> filteredList
获取其{(1}}}个Object.id
包含List<id> idsList
的{{1}}个List<Object>allObjects
。
考虑到适度的数据量,在解决这个问题的时候,有效和高效的方法是什么。
我正在使用java6
答案 0 :(得分:6)
我不想多次迭代这两个列表
为什么呢?过早优化是一件坏事。首先测试它,测量它是否足够有效,并解决问题如果它存在。
您可以使用简单的过滤器来完成此操作:
class Student
{
long id;
}
final List<Student> students = /*something*/;
final List<Long> rollNoList = /*something*/;
List<Student> newStudents = students.stream()
.filter(student -> rollNoList.contains(student.id))
.collect(Collectors.toList());
使用流进行此操作的优点是您可以稍后将其并行化。
另一个优化是检查您对数据结构的使用。正如Seelenvirtuose指出的那样,使用类似HashSet
的内容会将contains
的复杂性从O(n)降低到O(1):
final Set<Long> rollNoList = new HashSet<>();
如果您不能这样做,您可能会在增加内存使用量的同时看到一些性能提升,方法是在过滤前将List
复制到HashSet
:
final Set<Long> rollNumbers = new HashSet<>(rollNoList);
但如果您可以控制数据结构,只需从头开始使用HashSet
。