用于if条件的Java Lambda表达式 - 此处不需要

Pat*_*ick 4 java lambda java-8

考虑if条件需要评估数组或List的情况.一个简单的例子:检查所有元素是否都为真.但我正在寻找通用的方法来做到这一点

通常我会这样做:

boolean allTrue = true;
for (Boolean bool : bools){
    if (!bool) {
        allTrue = false;
        break;
     }
}
if (allTrue){
     // do Something
}
Run Code Online (Sandbox Code Playgroud)

但现在我想将它隐藏在我的if条件下.我尝试使用Lambda Expressions,但它不起作用:

if (() -> {
    for (Boolean bool : bools)
        if (!bool)
            return false;
    return true;
}){
      // do something
}
Run Code Online (Sandbox Code Playgroud)

如果这是有效的,我可以做一些更复杂的事情

if (() -> {
   int number = 0;
   for (MyObject myobject : myobjects)
       if (myObject.getNumber() != 0)
           numbers++;
   if (numbers > 2) 
       return false;
   return true;
 }{
     //do something
 }
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来做它只是一个语法错误?

更新 我不是在谈论布尔数组,而是寻找一种通用的方法来实现它.

fge*_*fge 13

你可以写,例如List<Boolean>:

if (!list.stream().allMatch(x -> x)) {
    // not every member is true
}
Run Code Online (Sandbox Code Playgroud)

要么:

if (list.stream().anyMatch(x -> !x)) {
    // at least one member is false
}
Run Code Online (Sandbox Code Playgroud)

如果你有一个布尔数组,那么用它Arrays.stream()来获取一个流.


更一般地说,对于Stream(通用)类型的提供元素X,您必须提供一个Predicate<? super X>to .{all,any}Match()("完整"谓词,或lambda,或方法引用 - 许多事情都去).我认为这些方法的返回值是不言自明的.


现在,要计算服从某个谓词的元素.count(),你可以将它与之结合起来.filter()- 它也可以将(无论是什么)a Predicate作为一个参数.例如,检查一个List<String>长度大于5的元素是否超过2个:

if (list.stream().filter(s -> s.length() > 5).count() > 2L) {
    // Yup...
}
Run Code Online (Sandbox Code Playgroud)