我在使用 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()
那么呢?
最佳答案
你的假设是正确的。您的流实现比 for 循环慢。
这种流的使用应该和 for 循环一样快:
EXCLUDE_PATHS.stream()
.map(String::toLowerCase)
.anyMatch(path::contains);
这将遍历项目,将 String::toLowerCase
和过滤器逐个应用于项目并在第一个匹配的项目处终止。
collect()
和 anyMatch()
都是终端操作。 anyMatch()
在第一个找到的项目处退出,而 collect()
需要处理所有项目。
关于java - 我什么时候应该使用流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42486428/