作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
考虑 if 条件需要评估数组或列表的情况。一个简单的例子:检查所有元素是否为真。但我正在寻找通用方法来做到这一点
通常我会这样做:
boolean allTrue = true;
for (Boolean bool : bools){
if (!bool) {
allTrue = false;
break;
}
}
if (allTrue){
// do Something
}
但现在我想将它隐藏到我的 if 条件中。我尝试为此使用 Lambda 表达式,但它不起作用:
if (() -> {
for (Boolean bool : bools)
if (!bool)
return false;
return true;
}){
// do something
}
如果这可行,我可以做一些更复杂的事情,比如
if (() -> {
int number = 0;
for (MyObject myobject : myobjects)
if (myObject.getNumber() != 0)
numbers++;
if (numbers > 2)
return false;
return true;
}{
//do something
}
是否有更好的方法来做到这一点只是一个语法错误?
更新我不是在谈论 boolean 数组,而是在寻找实现它的通用方法。
最佳答案
你可以这样写,例如 List<Boolean>
:
if (!list.stream().allMatch(x -> x)) {
// not every member is true
}
或者:
if (list.stream().anyMatch(x -> !x)) {
// at least one member is false
}
如果您有 boolean 值的数组,则使用Arrays.stream()
而是从中获取流。
更一般地,对于 Stream
提供(通用)类型的元素 X
, 你必须提供 Predicate<? super X>
至 .{all,any}Match()
(“完整”谓词、lambda 或方法引用——很多事情都可以)。这些方法的返回值是不言自明的——我认为。
现在,要计算 符合特定谓词的元素,您有 .count()
,您可以将其与 .filter()
结合使用-- 也接受(无论是什么)Predicate
作为论据。例如检查 List<String>
中是否有超过 2 个元素其长度大于 5 你会这样做:
if (list.stream().filter(s -> s.length() > 5).count() > 2L) {
// Yup...
}
关于用于 if 条件的 Java Lambda 表达式 - 此处不适用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23058864/
我是一名优秀的程序员,十分优秀!