使用Java中的Streams实现等效的Haskell"或"函数的好方法是什么

Tad*_*Tad 2 java haskell stream

我正在寻找使用Streams在Java中使用Haskell的"或"函数.

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

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

此版本无法运行,因为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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我是Java的新手,所以任何提示都会非常感激.谢谢.

Sot*_*lis 6

只需使用Stream#anyMatch(...)a Predicate返回值本身.

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

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

这是一种短路操作.它(实际上,它可以,但不必)true在找到true值后立即返回.