当前位置: 首页 > 知识库问答 >
问题:

if条件的Java Lambda表达式-此处不应为

岳池暝
2023-03-14

考虑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
 }

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

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

共有2个答案

公良照
2023-03-14
匿名用户

您当前的问题是您直接使用lambda表达式。Lambda是函数接口的实例。您的lambda没有布尔类型,这就是您的if不接受它的原因。

您可以在这里使用布尔集合中的流。

if (bools.stream().allMatch((Boolean b)->b)) {
    // do something
}

它实际上比这更强大,但我相信这确实可以做到这一点。

基本上,由于您需要一个if条件,因此您需要一个boolean结果。由于您的结果依赖于集合,因此您可以在集合上使用Java8个流。

Java 8 流允许您对集合执行许多操作,并以终端操作完成。您可以使用Stream的非终端操作做任何复杂的事情。最后,您需要以下两件事之一:

    < li >使用返回< code >布尔值的终端操作(例如< code>allMatch、< code>anyMatch...),就大功告成了 < li >使用任何终端操作,但在< code >布尔表达式中使用,如< code>myStream.filter(...).限制(...).计数()

你应该看看你在这个流文档中的可能性。

洪飞驰
2023-03-14

例如,给定一个< code >列表,您可以编写

if (!list.stream().allMatch(x -> x)) {
    // not every member is true
}

或:

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

如果您有一个布尔值数组,则使用 Arrays.stream() 从中获取流。

更一般地说,对于提供(泛型)类型 X 元素的,您必须提供谓词

现在,要计算服从某个谓词的元素,你有.count(),你可以将其与.filter()结合使用 - 它也采用(无论是什么)谓词作为参数。例如,检查列表中是否有 2 个以上的元素

if (list.stream().filter(s -> s.length() > 5).count() > 2L) {
    // Yup...
}

 类似资料:
  • New in Django 1.8. 条件表达式允许你在过滤器、注解、聚合和更新操作中使用 if ... elif ... else的逻辑。条件表达式为表中的每一行计算一系列的条件,并且返回匹配到的结果表达式。条件表达式也可以像其它 表达式一样混合和嵌套。 条件表达式类 我们会在后面的例子中使用下面的模型: from django.db import models class Client(m

  • 指定在表达式计算结果为 TRUE 时执行的命令。 if(表达式) 备注 包含表达式的 if 语句与像 If FoundColor <> Blue 这样的传统 if 语句的区别是,它在单词“if”后的字符为左大括号。尽管通常把整个表达式包围在括号中,不过也可以写成这样:if (x > 0) and (y > 0)。此外, 如果单词 "if" 后是 函数调用 或者类似 "not" 或 "!" 的运算符

  • 当需要根据表达式,而不是参数的值或数量进行匹配时,条件表达式(Guards)就显得非常有用。如果你熟悉函数式编程的话,对条件表达式也不会陌生。 为了尽可能地接近CSS的语言结构,Less使用关键字 when 而不是 if/else来实现条件判断,因为 when 已经在CSS的 @media query 特性中被定义。 表达式中可以使用比较运算符、逻辑运算符、或检查函数来进行条件判断。 1、比较运算

  • 尤达表达式 不要使用尤达表达式。尤达表达式是指,拿一个常量去和变量比较而不是拿变量去和常量比较。它就像是在表达 “蓝色是不是天空的颜色” 或者 “高个是不是这个男人的属性” 而不是 “天空是不是蓝的” 或者 “这个男人是不是高个子的” (译者注:名字起源于星球大战中尤达大师的讲话方式,总是用倒装的语序) 推荐: if ([myValue isEqual:@42]) { ... 不推荐: if ([

  • 英文原文:http://emberjs.com/guides/templates/conditionals/ 有些时候,或许我们只希望在一个属性存在的时候显示一部分模板。 这时,我们就可以使用{{#if}}助手按条件渲染一个代码块,如下所示: 1 2 3 {{#if person}} Welcome back, <b>{{person.firstName}} {{person.lastNam

  • 关键字 (Conditional keywords) 永远不要把 then 和多行的 if/unless 搭配使用。 # 错误 if some_condition then ... end # 正确 if some_condition ... end do 不要和多行的 while 或 until搭配使用。 # 错误 while x > 5 do ... end until x >