首页 > 解决方案 > Java,映射一个列表并在一行中进行包含检查还是遍历整个列表?

问题描述

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

1)

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

2)

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

标签: javajava-8

解决方案


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

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

if (employees.stream().anyMatch(e -> e.getId().equals(employeeId)))) {
  // do something
}

for一旦找到匹配的标识符,您的循环解决方案可以通过打破循环来类似地改进。

List改进后,如果相对较小,是否存在性能差异是没有意义的。我更喜欢Streams 版本,它更短且更具可读性。

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


推荐阅读