Java,映射一个列表并在一行中进行包含检查还是遍历整个列表?

M.D*_*etz 3 java java-8

我有一份员工名单。每个员工都有一个唯一的标识符id。我有一个employeeId并且必须检查由 代表的员工是否employeeid在列表中。我能想到的有两种方法,哪一种更好。有性能差异吗?

1)

if (employees.stream().map(Employee::getId).collect(Collectors.toList()).contains(employeeId)) {
  // do something
}
Run Code Online (Sandbox Code Playgroud)

2)

boolean employeeIsInsideTheList = false;
 for (Employee employee : employees) {
   if (employee.getId() == employeeId) {
      employeeIsInsideTheList = true;
    }
 }
if(employeeIsInsideTheList) {
  // do something
}
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 10

您的Stream版本违背了Streams的目的,因为它没有利用惰性求值和短路。您正在进行两次完整的迭代 - 第一次将List员工List的 ID转换为 ID,第二次在 ID 中搜索特定ListID(通过contains()方法)。

更好的解决方案是在不构建 ID 的情况下搜索匹配List的 ID:

if (employees.stream().anyMatch(e -> e.getId().equals(employeeId)))) {
  // do something
}
Run Code Online (Sandbox Code Playgroud)

您的for循环溶液可以通过一次匹配标识符被发现循环的爆发可以类似地得到改善。

改进后,如果List比较小,是否有性能差异没有意义。我更喜欢Streams 版本,它更短,更易读。

如果List很大,并且性能是一个问题,我建议您测量两种解决方案的性能,以确定哪个解决方案更快。

  • 或者 `emp.stream().map(Employee::getId).anyMatch(employeeId::equals)`。我还没决定我喜欢什么。 (2认同)