【发布时间】:2017-07-18 02:33:11
【问题描述】:
我在使用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 循环更具表现力和可读性。在后面你需要小心 if-then 和条件等的内在函数。流表达式非常清楚:将文件名转换为小写,然后通过某些东西过滤,然后计数,收集等结果:非常迭代计算流的表达。
-
这里不需要
new String[]{…}。只需使用Arrays.asList("my/path/one", "my/path/two") -
如果您的来源是
String[],则无需调用Arrays.asList。您可以使用Arrays.stream(array)流式传输阵列。顺便说一句,我很难完全理解isExcluded测试的目的。EXCLUDE_PATHS的元素是否真的包含在路径中的某处是否真的很有趣? IE。isExcluded("my/path/one/foo/bar/baz")将返回true,以及isExcluded("foo/bar/baz/my/path/one/")... -
太好了,我不知道
Arrays.stream方法,感谢您指出这一点。确实,我发布的示例对除我之外的其他人似乎毫无用处。我知道isExcluded方法的行为,但这实际上只是我自己需要的东西,因此,回答你的问题:是的,这很有趣,因为我不想提及,因为它不适合原始问题的范围。 -
在我们的团队中,我们发现流的使用导致比 for 循环等更多的问题和错误。这是因为并非所有团队都是流专家,而且流代码更神秘 - 你不能如果您不是流专家,请猜猜发生了什么,但任何人都可以阅读 for 循环和 if 语句。因此,在我们的团队中,我们更喜欢更长的显式代码,而不是具有很多功能但没有人真正知道它是否/如何工作以及是否存在性能问题的单行代码。其他团队可能更喜欢简洁的代码。
标签: java java-8 java-stream