2012-09-23 70 views
25

在像http://en.wikipedia.org/wiki/?:这样的页面中,三元/条件运算符?:似乎用于条件赋值。我试图用它来进行方法调用,如下所示:可以使用Java的三元/条件运算符(?:)来调用方法而不是分配值吗?

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

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

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

+14

不,不是那样的。只要像普通人一样使用“if”即可。 –

+1

我相信三元运算符应该将值赋给一个类型的实例,并进行条件检查。你所建议的方式不符合格式。 –

+0

@codesparkle - 没有太多的空间。 if(condition){doThis();} else {doThat();} – tehdoommarine

回答

18

认为三元运算符就像这种情况下的一种方法。话说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

“说一个?b:c等同于调用伪代码方法”< - Nope。考虑“b”或“c”有副作用的情况。因此,您需要将这些视为lambda表达式,就像您在后面的示例中所做的那样。 –

+0

是的。我会澄清一点,我正在简化。 – Jodaka

+3

@Jodaka,我认为你的编辑是正确的答案,因为它不是真的要返回一个值,而是关于Java不考虑的问题? b:c作为陈述。 – Kareem

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(); 
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(); 
相关问题