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

时间:2012-09-23 17:31:18

标签: java conditional-operator

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

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

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

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

3 个答案:

答案 0 :(得分: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视为一种陈述。

答案 1 :(得分: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(); 

答案 2 :(得分: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();