java - 我什么时候应该使用流?

标签 java java-8 java-stream

我在使用 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/

相关文章:

java - 导出到已签名的应用程序包时不显示 map

java - 无论我如何尝试都无法找到 CsvReader

java - 带有 Javassist 3.18.2-GA 的 Powermock 1.6.3 产生 NoSuchMethodError

Java 8 - 构造函数引用 - Select 类型未定义适用于此处的 Select(DataObj)”

java - 在 Java 中从 .txt 文件导入字符串时跳过每隔一行

java - "java.io.StreamCorruptedException: invalid stream header: 3C3F786D"尝试合并主报告中的多个子报告时

Java 8 Lambda 和 Streams...不是 "how",而是 "why"?

java - 过滤掉 CompletableFuture 的重复项

java IntStream cannot use collect(Collectors.toList()),编译错误,为什么?