使用a List
及其stream()
方法时,我刚遇到一个问题。虽然我知道如何使用它们,但是我不确定何时使用它们。
例如,我有一个列表,其中包含到不同位置的各种路径。现在,我想检查一个给定的路径是否包含列表中指定的任何路径。我想boolean
根据是否满足条件返回一个。
当然,这本身并不是一项艰巨的任务。但是我想知道我应该使用流还是for(-each)循环。
名单
private static final List<String> EXCLUDE_PATHS = Arrays.asList(new String[]{
"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;
}
示例-每次循环
private boolean isExcluded(String path){
for (String excludePath : EXCLUDE_PATHS) {
if(path.contains(excludePath.toLowerCase())){
return true;
}
}
return false;
}
请注意,该path
参数始终为小写。
我的第一个猜测是for-each方法更快,因为如果满足条件,循环将立即返回。而该流仍将在所有列表条目上循环以完成过滤。
我的假设正确吗?如果是这样,我为什么要(或者宁愿何时使用)stream()
呢?
new String[]{…}
。只需使用Arrays.asList("my/path/one", "my/path/two")
String[]
,则无需致电Arrays.asList
。您可以使用来流式处理数组Arrays.stream(array)
。顺便说一句,我很难isExcluded
完全理解测试的目的。是否真正EXCLUDE_PATHS
在路径中的某个位置包含的元素真的很有趣吗?即isExcluded("my/path/one/foo/bar/baz")
返回true
,以及isExcluded("foo/bar/baz/my/path/one/")
……
Arrays.stream
方法,感谢您指出。确实,我发布的示例对我以外的其他人似乎毫无用处。我知道该isExcluded
方法的行为,但实际上这只是我自己需要的,因此,可以回答您的问题:是的,出于我不愿提及的原因,它很有趣,因为它不适合该范围原始问题。
toLowerCase
应用于已经小写的常数?它不应该应用于path
论点吗?