有没有办法使用java8进一步优化下面的代码?

Fai*_*wai 6 java collections optimization java-8 java-stream

我在我的项目中遇到了以下代码.我想知道它是否可以进一步优化可能是通过使用java 8流或一般的集合API.

private Set<Student> getFilteredSet() {
    Set<Student> unfilteredSet = getAllStudents();
    Set<Student> adminAreaSet = getAdminStudents();

    Set<String> adminAreaID = new HashSet<>();
    Set<Student> filteredSet = new HashSet<>();

    for (final Student student : adminAreaSet) {
        adminAreaID.add(student.getId());
    }
    for (final Student student : unfilteredSet) {
        if (adminAreaID.contains(student.getId())) {
            filteredSet.add(student);
        }
    }   
    return filteredSet;
}
Run Code Online (Sandbox Code Playgroud)

注意: unfilteredSetadminAreaSet保持不同的子类型Student

Nam*_*man 8

由于问题是用标记的,因此提高代码可读性的一种方法是将其转换为:

Set<String> adminAreaID = getAdminStudents().stream()
        .map(Student::getId)
        .collect(Collectors.toSet());

return getAllStudents().stream()
        .filter(student -> adminAreaID.contains(student.getId()))
        .collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)

  • @shmosel可能不在该方法的范围/上下文中(因为我们已经实现了目标).只是想指出,不能保证`Collectors.toSet()`返回的Set类型.但我同意,这里不需要. (2认同)
  • 是.今天它返回`HashSet :: new`.但是不能保证它将来会继续这样做..对吗? (2认同)
  • @shmosel是的.我同意你说的话.如果是这种情况,那么没有人会使用它并通过传递我们期望的类型来使用它(toCollection). (2认同)
  • @ user7是的,您可以假设它们不会使情况变得更糟,但是,可能会有不同的考虑因素.如果您的代码在内存非常低的环境中运行并且特定的JRE提供的映射比"O(1)"查找更糟,但需要更少的内存,该怎么办?这就是我所说的"有一个理由"而你并没有从抵消它中获益.因此,如果您不需要保证,例如可变性,请不要坚持使用`HashMap`. (2认同)