为了账号安全,请及时绑定邮箱和手机立即绑定

用谓词限制流

用谓词限制流

临摹微笑 2019-06-17 14:30:36
用谓词限制流是否存在限制(潜在无限)的Java 8流操作?Stream直到第一个元素不能匹配谓词?在Java 9中,我们可以使用takeWhile如下面的示例所示,打印小于10的所有数字。IntStream     .iterate(1, n -> n + 1)     .takeWhile(n -> n < 10)     .forEach(System.out::println);由于Java 8中没有这样的操作,以一般方式实现它的最佳方法是什么?
查看完整描述

3 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

这样的行动应该是可能使用Java 8Stream,但不一定能高效地完成-例如,您不一定能够并行化这样的操作,因为您必须按顺序查看元素。

API并不提供一种简单的方法来实现它,但是最简单的方法可能是Stream.iterator(),将Iterator的实现,然后返回到Spliterator然后Stream..或者-也许-包好Spliterator,尽管在这个实现中它不能再被分割了。

这里有一个未经测试的实现takeWhile在.上Spliterator:

static <T> Spliterator<T> takeWhile(
    Spliterator<T> splitr, Predicate<? super T> predicate) {
  return new Spliterators.AbstractSpliterator<T>(splitr.estimateSize(), 0) {
    boolean stillGoing = true;
    @Override public boolean tryAdvance(Consumer<? super T> consumer) {
      if (stillGoing) {
        boolean hadNext = splitr.tryAdvance(elem -> {
          if (predicate.test(elem)) {
            consumer.accept(elem);
          } else {
            stillGoing = false;
          }
        });
        return hadNext && stillGoing;
      }
      return false;
    }
  };}static <T> Stream<T> takeWhile(Stream<T> stream, Predicate<? super T> predicate) {
   return StreamSupport.stream(takeWhile(stream.spliterator(), predicate), false);}


查看完整回答
反对 回复 2019-06-17
?
萧十郎

TA贡献1815条经验 获得超13个赞

allMatch()是一个短路函数,所以您可以使用它来停止处理。主要的缺点是你必须做两次测试:一次是为了看是否应该处理它,另一次是看是否要继续进行。

IntStream
    .iterate(1, n -> n + 1)
    .peek(n->{if (n<10) System.out.println(n);})
    .allMatch(n->n < 10);


查看完整回答
反对 回复 2019-06-17
  • 3 回答
  • 0 关注
  • 364 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信