Java 8 流条件处理

标签 java java-8 java-stream

我有兴趣将一个流分成两个或多个子流,并以不同的方式处理元素。例如,一个(大)文本文件可能包含 A 类型的行和 B 类型的行,在这种情况下,我想执行以下操作:

File.lines(path)
.filter(line -> isTypeA(line))
.forEachTrue(line -> processTypeA(line))
.forEachFalse(line -> processTypeB(line))

前面是我尝试抽象的情况。实际上,我有一个非常大的文本文件,其中每一行都在针对正则表达式进行测试;如果该行通过,则对其进行处理,而如果该行被拒绝,则我想更新一个计数器。这种对被拒绝字符串的进一步处理是我不简单地使用 filter 的原因。

是否有任何合理的方法可以使用流来执行此操作,或者我是否必须回退到循环? (我也希望它可以并行运行,所以流是我的首选)。

最佳答案

Java 8 流并非旨在支持这种操作。来自 jdk :

A stream should be operated on (invoking an intermediate or terminal stream operation) only once. This rules out, for example, "forked" streams, where the same source feeds two or more pipelines, or multiple traversals of the same stream.

如果您可以将其存储在内存中,则可以使用 Collectors.partitioningBy如果您只有两种类型并使用 Map<Boolean, List> .否则使用 Collectors.groupingBy .

关于Java 8 流条件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35854574/

相关文章:

java - 如何让 Cobertura 因低代码覆盖率而使 M2 构建失败

java - 如何找到奇偶校验异常值 kata

java - 对复合对象列表进行分组

java - 检查是否全部为真并使用 Java 8 的单行 lambda 表达式重置 boolean [] 数组

java - Stream.sorted().forEach() 是否按预期工作?

java - 为什么从 Java 代码访问对象类的 const 字段时出现错误

java - 我如何避免这种忙等待?

testing - Java 8 Lambda 的单元测试

Java 8 流并行度 : set number of threads to use?

Java 8 语法迭代并调用基于所有元素的否定谓词的方法?