【问题标题】:Can Java's ternary/conditional operator (?:) be used to call methods instead of assigning values?Java 的三元/条件运算符 (?:) 可以用来调用方法而不是赋值吗?
【发布时间】:2012-09-15 07:03:18
【问题描述】:

在像http://en.wikipedia.org/wiki/?: 这样的页面中,三元/条件运算符?: 似乎用于条件赋值。我尝试将它用于方法调用,如下所示:

(condition) ? doThis() : doThat();

这两种方法都返回 void。 Java 告诉我这不是声明。

所以,我猜我不能进行条件方法调用......或者我可以吗?

【问题讨论】:

  • 不,不是那样的。像普通人一样使用if
  • 我相信三元运算符应该通过条件检查将值分配给类型的实例。您建议的方式不符合格式。
  • @codesparkle - 空间不大。 if (条件){doThis();}else{doThat();}
  • 你可以让你的方法返回Void。 ;)
  • 无效与无效不同。那个大写字母很重要。

标签: java conditional-operator


【解决方案1】:

在这种情况下,可以将三元运算符视为方法。说 a ? b : c 是(对于您正在考虑的意图和目的,请参阅 lasseespeholt 的评论)相当于调用伪代码方法:

ternary(a, b, c)
    if a
        return b
    else
        return c

这就是为什么人们可以说像x = a ? b : c 这样的话;基本上就像在说x = ternary(a, b, c)。当你说(condition) ? doThis() : doThat() 时,你实际上是在说:

if condition
    return doThis()
else
    return doThat()

看看如果我们尝试用方法替换它们返回的内容会发生什么

 if condition
    return ???
 else
    return ???

考虑它甚至没有意义。 doThis()doThat() 不返回任何内容,因为 void 不是可实例化类型,因此 ternary 方法也无法返回任何内容,因此 Java 不知道如何处理您的语句和抱怨。

有一些方法可以解决这个问题,但它们都是不好的做法(您可以修改您的方法以具有返回值但不对它们返回的内容做任何事情,您可以创建调用您的方法然后返回的新方法空等)。在这种情况下,您最好使用 if 语句。

编辑 此外,还有一个更大的问题。即使您要返回值,Java 也不会将 a ? b : c 视为任何意义上的语句。

【讨论】:

  • “说 a ? b : c 相当于调用伪代码方法” b 或c 有副作用的情况。因此,您需要将它们视为 lambda,就像您在后面的示例中所做的那样。
  • 是的。我会澄清我正在简化。
  • @Jodaka,我认为您的编辑是正确的答案,因为它实际上不是关于返回值,而是关于 Java 不考虑 ? b : c 作为声明。
【解决方案2】:

三元运算符只是语法糖
它使代码更容易读/写,但它没有添加真正的功能。
它的主要用途是将几行代码压缩成一行,在构建根据某些条件略有不同的字符串时非常有用。

例如。

Collection<?> col = ...
System.out.println("There " + (col.size()==1 ? "is" : "are") + " "
     + col.size() + " " + (col.size()==1 ? "element" : "elements")
     + " in the collection");

而不是

Collection<?> col = ...
String message = "There ";
if(col.size()==1)
    message += "is";
else
    message += "are";
message += " "+col.size()
if(col.size()==1)
    message += " element";
else
    message += " elements";
message += " in the collection";
System.out.println(message);

如您所见,它简化了代码。
(注意:在第二个例子中最好使用StringBuilder而不是字符串连接)

但是由于(condition) ? doThis() : doThat();(没有返回值)与if(condition) doThis(); else doThat(); 具有相同的含义,因此将有两种编写相同内容的方法,而无需添加功能。它只会使事情复杂化:

  • 对于程序员:代码不统一
  • 对于三元运算符的实现:它现在也必须 支持void方法

所以,三元运算不能用于条件方法调用。改用 if-else:

if(condition)
    doThis();
else
    doThat(); 

【讨论】:

    【解决方案3】:

    三元(条件)运算符返回一个值。如果您的方法不这样做,它们就不能用作运算符的一部分(它获取值的地方)。

    为了更好地理解它,让我们考虑一个简单的二元运算符:+。它是这样工作的:

    <eval1> + <eval2>  -->  <value>
    

    它需要 2 个可评估的部分,并返回另一个。 如果你输入了

    doThis() + doThat();
    

    甚至

    gimmeAValue = doThis() + doThat();
    

    它会失败,因为 doThis()doThat() 都不会评估任何东西(它们“返回”void)。 当然,&lt;eval1&gt;&lt;eval2&gt; 都必须是某种“兼容”类型,以便+ 运算符可以处理它们并返回某种类型的值。

    现在让我们看看三元运算符:

    <evalBoolean> ? <eval1> : <eval2>  -->  <value>
    

    它需要 3 个可评估的部分,并返回一个值。

    第一个可评估部分必须能够被编译器理解(可转换)为布尔值。它将用于决定必须退回其他 2 个可评估部分中的哪一个。

    另外两个可评估的部分必须是,嗯……可评估的。对某事。某种类型的。

    换句话说:三元条件运算符旨在返回某些内容,而不是代码分支。这样使用:

    gimmeAValue = testMe() ? returnThis() : returnThat();
    

    【讨论】:

      猜你喜欢
      • 2021-11-16
      • 2017-07-16
      • 2021-08-27
      • 2011-09-24
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      • 2011-03-06
      • 2014-02-03
      相关资源
      最近更新 更多