28

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

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

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

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

4

3 回答 3

22

在这种情况下,将三元运算符视为一种方法。说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 不知道如何处理您的声明并抱怨。

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

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

于 2012-09-23T17:44:08.713 回答
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(); 
于 2012-09-23T18:39:53.367 回答
1

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

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

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

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

doThis() + doThat();

甚至

gimmeAValue = doThis() + doThat();

它会失败,因为既不doThis()也不doThat()评估任何东西(他们“返回” void)。当然,两者<eval1>和都<eval2>必须是某种“兼容”类型,以便+操作员可以处理它们并返回某种类型的值。

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

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

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

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

其他两个可评估的部分必须是……可评估的。对某事。某种类型的。

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

gimmeAValue = testMe() ? returnThis() : returnThat();
于 2012-09-23T22:07:23.453 回答