如何将Java嵌套foreach循环重构为Stream流实现?
重构嵌套循环为Stream流实现
最优且高效的实现方式
先将CSV读取到的ID列表转换为HashSet优化查找性能,再通过Stream过滤匹配的Task:
private List<Task> readHistoryFromFile() { Set<String> taskIds = new HashSet<>(readFromCsvHistoryFromFile()); return fromString().stream() .filter(task -> taskIds.contains(task.getId().toString())) .collect(Collectors.toList()); }
说明
- 原嵌套循环的时间复杂度是O(m*n),其中m为ID数量,n为Task数量,转为HashSet后
contains操作时间复杂度降为O(1),整体复杂度优化为O(m+n),性能提升明显 - 代码逻辑清晰,直接通过
filter筛选符合条件的Task,用collect收集结果
最简(但性能较低)的实现
如果不考虑性能优化,仅追求代码简洁,也可以直接用列表的contains:
private List<Task> readHistoryFromFile() { List<String> ids = readFromCsvHistoryFromFile(); return fromString().stream() .filter(task -> ids.contains(task.getId().toString())) .collect(Collectors.toList()); }
注意:这种方式的
contains是O(n)时间复杂度,当数据量较大时性能不如HashSet版本
内容的提问来源于stack exchange,提问作者OpeJI
相关产品推荐
相关产品推荐

