是否有Java 8流操作限制(可能是无限的)Stream直到第一个元素无法匹配谓词?
在Java 9中,我们可以使用takeWhile下面的示例来打印小于10的所有数字.
IntStream
.iterate(1, n -> n + 1)
.takeWhile(n -> n < 10)
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
由于Java 8中没有这样的操作,以一般方式实现它的最佳方法是什么?
我正在尝试弄清楚如何在Java 8 Stream上实现自定义的中间操作。看来我被封锁了:(
具体来说,我想获取一个流并返回直到并包括具有特定值的第一个条目的每个条目。而且我想在此之后停止生成任何内容-使其短路。
它正在对输入数据进行一系列验证检查。如果有一个错误,我想停在第一个错误上,但是我想在路上整理警告。而且由于这些验证检查可能很昂贵-例如涉及数据库查找-我只想运行所需的最小设置。
因此,代码将类似于:
Optional<ValidationResult> result = validators.stream()
.map(validator -> validator.validate(data))
.takeUntil(result -> result.isError()) // This is the bit I can't do
.reduce(new ValidationResult(), ::mergeResults);
Run Code Online (Sandbox Code Playgroud)
这似乎是我应该可以做一些与ReferencePipeline.StatefulOp,不同之处在于它的所有包范围,所以我不能扩展。所以我想知道实现这一目标的正确方法是什么?还是有可能?
还要注意-这需要使用Java 8,而不是9+,因为由于各种不相关的原因我们还没有出现。
干杯
Java 8有一种从文件行创建Stream的方法.在这种情况下,foreach将逐步执行.我有一个格式如下的文本文件..
bunch of lines with text
$$$$
bunch of lines with text
$$$$
Run Code Online (Sandbox Code Playgroud)
我需要将之前的每一行都$$$$放到Stream中的单个元素中.
换句话说,我需要一串字符串.每个字符串都包含之前的内容$$$$.
这样做的最佳方式是什么(最小的开销)?