java - 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
}
解决方案
您的Stream
版本违背了Stream
s 的目的,因为它没有利用惰性求值和短路。您正在进行两次完整的迭代 - 第一次将List
员工转换List
为 ID,第二次在 ID 中搜索特定List
ID(通过contains()
方法)。
更好的解决方案是在不构建 ID 的情况下搜索匹配List
的 ID:
if (employees.stream().anyMatch(e -> e.getId().equals(employeeId)))) {
// do something
}
for
一旦找到匹配的标识符,您的循环解决方案可以通过打破循环来类似地改进。
List
改进后,如果相对较小,是否存在性能差异是没有意义的。我更喜欢Stream
s 版本,它更短且更具可读性。
如果List
它很大,并且性能是一个问题,我建议您测量两种解决方案的性能,以找出哪个更快。
推荐阅读
- javascript - blur() 方法未触发更改事件
- oracle - 如何在所有模式及其分配的角色上备份对象权限,除了 oracle 中的默认用户帐户?
- r - 查找满足R中条件的下一行的值
- docusaurus - 有没有办法仅将 Docusaurus 用于 /docs 目录?
- cmd - gnuplot 错误:“第 114 行:警告:跳过没有有效点的数据文件”、“第 114 行:所有点 y 值未定义!”。“找不到或打开文件”
- python - 如何在使用 make_csv_dataset 创建的数据集上制作 train_test_split
- javascript - 使用 Javascript 在较小的屏幕上调整 SVG 大小
- selenium - 如何为使用启用了 MFA 的 AWS Cognito 的应用程序编写用户登录的自动化测试用例?
- php - 通过 PHP 的 cURL 请求导致本地 nginx 服务器超时
- python - 使用自定义 dupefilter scrapy 取消所有请求