我感兴趣的是将一个流分成两个或多个子流,并以不同的方式处理元素。例如,一个(大)文本文件可能包含 A 类型的行和 B 类型的行,在这种情况下我想要执行以下操作:
File.lines(path)
.filter(line -> isTypeA(line))
.forEachTrue(line -> processTypeA(line))
.forEachFalse(line -> processTypeB(line))
前一个是我试图抽象化这种情况。实际上,我有一个非常大的文本文件,其中每一行都针对正则表达式进行测试;如果该行通过,那么它就会被处理,而如果它被拒绝,那么我想更新一个计数器。对被拒绝的字符串进行进一步处理是我不简单地使用的原因filter
.
有没有任何合理的方法可以用流来做到这一点,或者我必须回退到循环? (我也希望它能够并行运行,所以流是我的第一选择)。
Java 8 流并不是为支持这种操作而设计的。来自jdk https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html:
流只能被操作(调用中间或终端流操作)一次。例如,这排除了“分叉”流,即同一源提供两个或多个管道,或同一流的多次遍历。
如果您可以将其存储在内存中,则可以使用Collectors.partitioningBy
如果你只有两种类型并选择Map<Boolean, List>
。否则使用Collectors.groupingBy
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)