我感兴趣的是将一个流分成两个或多个子流,并以不同的方式处理这些元素。例如,一个(大)文本文件可能包含类型 A 的行和类型 B 的行,在这种情况下,我想做类似的事情:
File.lines(path)
.filter(line -> isTypeA(line))
.forEachTrue(line -> processTypeA(line))
.forEachFalse(line -> processTypeB(line))
前一个是我对情况进行抽象的尝试。实际上,我有一个非常大的文本文件,其中每一行都针对正则表达式进行测试;如果该行通过,那么它就会被处理,而如果它被拒绝,那么我想更新一个计数器。这种对拒绝字符串的进一步处理是我不简单地使用 filter
的原因。
有什么合理的方法可以用流来做到这一点,还是我必须回退到循环? (我也希望它并行运行,所以流是我的首选)。
原文由 gdiazc 发布,翻译遵循 CC BY-SA 4.0 许可协议
Java 8 流并不是为支持这种操作而设计的。来自 jdk :
如果你可以将它存储在内存中,你可以使用
Collectors.partitioningBy
如果你只有两种类型并使用Map<Boolean, List>
。否则使用Collectors.groupingBy
。