三元运算符

35

是否可以更改这个:

if (string != null) {
    callFunction(parameters);
} else {
    // Intentionally left blank
}

转换为三元运算符吗?


3
Java 中的 if 语句没有返回类型;如果要使用三元运算符重新编码它,则需要添加一个返回类型。 - Chris K
1
简短回答是“不”,你为什么要这样做呢? - Henry
3
如果条件为假时不执行任何操作,那么三元运算符就没有太多意义。 - Eran
我认为在这个逻辑中尝试添加三元运算符是毫无意义的。在我看来,这不会使您的代码更易读或更易维护。 - JamesB
4个回答

61

嗯,Java中的三元运算符的作用如下...

return_value = (true-false condition) ? (if true expression) : (if false expression);

......另一种看待它的方式是......

return_value = (true-false condition) 
             ? (if true expression) 
             : (if false expression);

你的问题有些模糊,我们需要在这里做出假设。
  • If (and only if) callFunction(...) declares a non-void return value (Object, String, int, double, etc..) - it seems like it does not do that via your code - then you could do this...

    return_value = (string != null) 
                 ? (callFunction(...)) 
                 : (null);
    
  • If callFunction(...) does not return a value, then you cannot use the ternary operator! Simple as that. You will be using something that you don't need.

    • Please post more code to clear up any issues

然而,三元运算符应该仅表示替代赋值!

您的代码似乎并非如此,因此您不应该这样做。

以下是它们应该工作的方式...

if (obj != null) {            // If-else statement

    retVal = obj.getValue();  // One alternative assignment for retVal

} else {

    retVal = "";              // Second alternative assignment for retVale

}

这可以转换为...

retVal = (obj != null)
       ? (obj.getValue())
       : ("");

由于看起来你可能只是想将这段代码重构成一行,因此我添加了以下内容

另外,如果你的假条件确实为空,则可以这样做...

if (string != null) {

    callFunction(...);

} // Take note that there is not false clause because it isn't needed

或者

if (string != null) callFunction(...);  // One-liner

2
你不应该将实际上是“表达式”的东西称为“语句”。在Java语言中,这两个词有着精确的含义。 - Holger

3
三元运算符可以用于组合两个表达式,但是空语句不是一个表达式。
如果方法返回一个值(即未声明为void),则可以将方法调用用作表达式,并且它可以与虚拟常量null一起用于形成三元运算符,但结果仍然是一个表达式,这在需要语句的地方是不允许的,换句话说,它不能替代if语句。
通过添加另一个构造来接受表达式并不施加任何附加副作用,您可以构建完整的替代方案。例如,通过声明和分配一个新的、否则未使用的本地变量,您可以获得:
Object dummy=condition? callFunction(parameters): null;

但是,与仅仅说 if(condition) callFunction(parameters); 相比,并没有任何优势。如果返回值是一个原始类型,则可能会增加不必要的开销,因为它将执行自动装箱。

Java 8 中有一种解决这个谜题的方法,即使对于 void 方法也适用:

((Runnable)(condition? ()->callFunction(parameters): ()->{})).run();

但它仍然没有比简单使用 if 语句更具优势。

3

可以。在else块中保持相同的null即可。

String result = str !=null ?  callFunction(parameters) : null;

确保 callFunction(parameters) 返回一个 String

1
你在这里假设callFunction返回一个对象。如果它是void或原始返回类型,你将会遇到问题。 - Chris K
@ChrisK 很明显要返回一个字符串。无论如何,我还是加了一条注释。 - Suresh Atta
@Niru,“我不认为这是可能的,因为callFunction没有String返回类型”..谁说没有String返回类型? - Suresh Atta
2
@sᴜʀᴇsʜ ᴀᴛᴛᴀ:谁告诉你它有一个String返回类型?问题的代码并不支持这样的结论。 - Holger
1
如果从问题中有什么明显的东西,那就是没有返回值,因为OP的代码没有尝试去捕获它。这是最明显的一段代码,可以描述为“只有在那个不为空时才执行这个”。if语句用于执行操作,三元运算符用于计算值。 - William F. Jameson
显示剩余3条评论

2
如果你的方法 callFunction() 有返回类型,那么这是可能的。你可以像 SURESH ATTA 在他的回答中写的那样做:
String result = str!=null ? callFunction(str) : null;

或者使用任何其他类型的结果或任何其他参数。如果您想在 else 语句中调用一个方法,这个方法需要与您 if 语句中的方法具有相同的返回类型。

如果您的方法没有返回类型/ callFunction() 的返回类型为 void,则无法将您的 if-else 语句更改为三元运算符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接