从List <long>中包含的id <list>列表中获取All对象

时间:2017-07-14 13:58:40

标签: java collections comparison java-6

如何从另一个List<Object> filteredList获取其{(1}}}个Object.id包含List<id> idsList的{​​{1}}个List<Object>allObjects。 考虑到适度的数据量,在解决这个问题的时候,有效和高效的方法是什么。

我正在使用java6

1 个答案:

答案 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