在像http://en.wikipedia.org/wiki/?:这样的页面中,三元/条件运算符?:
似乎用于条件赋值。我试图用它来进行方法调用,如下所示:可以使用Java的三元/条件运算符(?:)来调用方法而不是分配值吗?
(condition) ? doThis() : doThat();
两种方法都返回void。 Java告诉我这不是一个声明。
所以,我猜我不能做条件方法调用...或者我可以吗?
在像http://en.wikipedia.org/wiki/?:这样的页面中,三元/条件运算符?:
似乎用于条件赋值。我试图用它来进行方法调用,如下所示:可以使用Java的三元/条件运算符(?:)来调用方法而不是分配值吗?
(condition) ? doThis() : doThat();
两种方法都返回void。 Java告诉我这不是一个声明。
所以,我猜我不能做条件方法调用...或者我可以吗?
认为三元运算符就像这种情况下的一种方法。话说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
声明。
三元运算符是简单地语法糖。
它使代码更易于读取/写入,但不会增加真正的功能。
它的主要用途是将几行代码压缩到一行中,并且在构建基于某些条件略微不同的字符串时非常有用。
例如。
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();
三元(条件)运算符返回一个值。如果你的方法没有,它们不能被用作操作符的一部分(它取值的地方)。
为了更好地理解它,我们来考虑一个简单的二元运算符:+
。它的工作方式如下:
<eval1> + <eval2> --> <value>
它需要2个可评估部分,并返回另一个。 如果键入
doThis() + doThat();
甚至
gimmeAValue = doThis() + doThat();
它会失败,因为无论doThis()
也不doThat()
评价任何东西(他们 “回归” void
)。 当然,<eval1>
和<eval2>
必须是某种“兼容”类型,以便+
运算符可以处理它们并返回某种类型的值。
现在让我们看看三元运算符:
<evalBoolean> ? <eval1> : <eval2> --> <value>
它需要3个评估部分,并返回一个值。
第一个可评估部分必须由编译器作为布尔值来理解(可转位)。它将用于决定其他2个可评估零件中的哪一个必须退回。
其他两个可评估零件必须是...可评估的。对某事。某种类型的。
换句话说:三元条件运算符旨在返回某些内容,而不是代码分支。使用这种方式:
gimmeAValue = testMe() ? returnThis() : returnThat();
不,不是那样的。只要像普通人一样使用“if”即可。 –
我相信三元运算符应该将值赋给一个类型的实例,并进行条件检查。你所建议的方式不符合格式。 –
@codesparkle - 没有太多的空间。 if(condition){doThis();} else {doThat();} – tehdoommarine