可以使用Java的三元/条件运算符(?:)来调用方法而不是赋值吗?

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

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

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

所以,我猜我不能做条件方法调用……或者我可以吗?

在这种情况下,将三元运算符视为一种方法。 说a ? b : c a ? b : c (对于你正在考虑的意图和目的,参见lasseespeholt的评论)等同于调用伪代码方法:

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

这就是人们可以说x = a ? b : c x = a ? b : c ; 它基本上就像是说x = ternary(a, b, c) 。 当你说(condition) ? doThis() : doThat() (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 a ? b : c任何意义上的陈述。

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

例如。

 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而不是String concatenation)

但既然(condition) ? doThis() : doThat(); (condition) ? doThis() : doThat(); (没有返回值)具有与if(condition) doThis(); else doThat();相同的含义if(condition) doThis(); else doThat(); if(condition) doThis(); else doThat(); 在没有添加function的情况下,有两种方法可以编写相同的内容。 它只会使事情变得复杂:

  • 程序员:代码不统一
  • 为了实现三元运算符:它现在还必须支持void方法

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

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

三元(条件)运算符返回一个值。 如果您的方法没有,则它们不能用作运算符的一部分(它取值的位置)。

为了更好地理解它,让我们想一个简单的二元运算符: + 。 它的工作方式如下:

  +  -->  

它需要2个可评估的部分,然后返回另一个部分。 如果你打字

 doThis() + doThat(); 

甚至

 gimmeAValue = doThis() + doThat(); 

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

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

  ?  :  -->  

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

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

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

换句话说:三元条件运算符旨在返回一些东西,而不是代码分支。 用这种方式:

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