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)