【问题标题】:Ternary Operator - JAVA [duplicate]三元运算符 - JAVA [重复]
【发布时间】:2014-09-29 14:02:24
【问题描述】:

是否可以更改:

if(String!= null) {

    callFunction(parameters);

} else {

    // Intentionally left blank

}

...到三元运算符?

【问题讨论】:

  • Java 中的 if 语句没有返回类型;要使用三元运算符对其重新编码,则必须添加一个。
  • 简短的回答是“不”,你为什么要这样做?
  • 条件为假的时候什么都不做的话,三元运算符就没多大意义了。
  • String(类)何时成为null
  • 我认为尝试在此逻辑中添加三元运算符是没有意义的。它不会使您的代码更具可读性或可维护性 IMO。

标签: java ternary-operator


【解决方案1】:

嗯,Java 中的ternary operator 是这样的......

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

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

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

你的问题有点模糊,我们必须在这里假设。

  • 如果(且仅当) callFunction(...) 声明 non-void 返回值(ObjectStringintdouble 等) - 似乎它没有通过您的代码执行此操作 - 那么您可以执行此操作...

    return_value = (string != null) 
                 ? (callFunction(...)) 
                 : (null);
    
  • 如果callFunction(...) 没有返回值,那么您不能使用三元运算符!就那么简单。您将使用不需要的东西。

    • 请发布更多代码以解决任何问题

尽管如此,三元运算符应该只代表替代赋值!您的代码似乎没有这样做,所以您不应该这样做。

它们应该是这样工作的......

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

【讨论】:

  • 您不应该将“陈述”一词用于实际上是“表达”的事物。这两个词在 Java 语言中具有精确的含义。
【解决方案2】:

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

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

确保callFunction(parameters) 返回String

【讨论】:

  • 您在这里假设 callFunction 返回一个对象。如果它是 void 或原始返回类型,您将遇到问题。
  • @ChrisK 这很明显返回一个字符串。还是添加了注释。
  • @sureshatta,只有已经知道的人才能明白。它将改进答案以使其明确。
  • @sᴜʀᴇsʜ ᴀᴛᴛᴀ:谁告诉你它有 String 返回类型?问题的代码不允许这样的结论。
  • 如果问题有什么明显的,那么就是有 no 返回值,因为 OP 的代码没有尝试捕获它。这是最明显的一段代码,可以描述为“仅当 that 不为空时才执行 this”。 事情是if 的用途; 计算值是三元运算符的用途。
【解决方案3】:

三元运算符可用于组合两个表达式,但空的语句不是表达式。

如果方法返回一个值(读取:未声明void),则方法调用可以用作表达式,并且可以与虚拟常量null一起使用以形成三元运算符,但结果会在需要语句的地方再次成为不允许的表达式,换句话说,它不能替换if语句。

通过添加另一个带有表达式且不施加额外副作用的构造,您可以构造一个完整的替换。例如。通过声明和分配一个新的,否则未使用的局部变量,您将获得:

Object dummy=condition? callFunction(parameters): null;

但简单地说if(condition) callFunction(parameters); 并没有什么好处。它甚至可能会增加不必要的开销,因为如果返回值是原始类型,它将执行自动装箱。

使用 Java 8 可以解决这个难题,甚至适用于 void 方法:

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

但与简单地使用if相比,它仍然没有优势。

【讨论】:

    【解决方案4】:

    如果您的方法callFunction() 具有返回类型,则有可能。然后,您可以像 SURESH ATTA 在他的回答中写的那样:

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

    或者任何其他类型的结果或任何其他参数。如果您也想调用else-Statement 中的方法,则此方法需要与if-statement 中的方法具有相同的返回类型。

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

    【讨论】:

      猜你喜欢
      • 2015-03-25
      • 1970-01-01
      • 1970-01-01
      • 2019-07-14
      • 2011-05-05
      • 2014-02-08
      • 2011-03-12
      • 2014-04-20
      相关资源
      最近更新 更多