我正在使用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
。