在Java中使用Streams实现Haskell的"or"函数的好方法



我正在使用Streams在Java中寻找与Haskell的"or"函数等效的函数。

当给定无限流时,此版本不会返回:

    public static Boolean or(Stream<Boolean> bs) {
      return bs.reduce(false, (x, y) -> x || y);
    }

此版本未运行,因为bs流被使用了两次:

    public static Boolean or(Stream<Boolean> bs) {
    Optional<Boolean> b0 = bs.findFirst();
    if (b0.isPresent()) {
        return  b0.get() || or(bs.skip(1));
    } else {
        return false;
    }
}

我是Java的新手,所以任何提示都将不胜感激。谢谢

只需将Stream#anyMatch(...)与返回值本身的Predicate一起使用即可。

// assuming there are no null values
boolean or = booleans.anyMatch(b -> b); // will only match if value is true

类似于您链接的or的Haskell文档中所描述的内容,如果Stream是无限的,则不能返回false。如果它看到的只是false值,那么它将继续消耗Stream

这是一次短路操作。一旦找到true值,它就会(实际上,它可以,但不必)返回true

最新更新