我刚刚在使用 List
及其 stream()
方法时遇到了一个问题。虽然我知道 如何 使用它们,但我不太确定 何时 使用它们。
例如,我有一个列表,其中包含通往不同位置的各种路径。现在,我想检查一个给定的路径是否包含列表中指定的任何路径。我想根据是否满足条件返回 boolean
。
当然,这本身并不是一项艰巨的任务。但是我不知道我应该使用流还是 for(-each) 循环。
名单
private static final List<String> EXCLUDE_PATHS = Arrays.asList(
"my/path/one",
"my/path/two"
);
使用流的示例:
private boolean isExcluded(String path) {
return EXCLUDE_PATHS.stream()
.map(String::toLowerCase)
.filter(path::contains)
.collect(Collectors.toList())
.size() > 0;
}
使用 for-each 循环的示例:
private boolean isExcluded(String path){
for (String excludePath : EXCLUDE_PATHS) {
if (path.contains(excludePath.toLowerCase())) {
return true;
}
}
return false;
}
请注意, path
参数始终为 _小写_。
我的第一个猜测是 for-each 方法更快,因为如果满足条件,循环会立即返回。而流仍然会遍历所有列表条目以完成过滤。
我的假设正确吗?如果是这样, _为什么_(或者说 _什么时候_)我会使用 stream()
那么?
原文由 mcuenez 发布,翻译遵循 CC BY-SA 4.0 许可协议
你的假设是正确的。您的流实现比 for 循环慢。
这个流的使用应该和 for 循环一样快:
这将遍历项目,将
String::toLowerCase
和过滤器逐个应用于项目,并 在第一个匹配的项目处终止。collect()
&anyMatch()
都是终端操作。anyMatch()
在找到第一个项目时退出,而collect()
需要处理所有项目。