【问题标题】:Ternary Operators Java三元运算符 Java
【发布时间】:2014-02-08 18:40:52
【问题描述】:

有没有办法在三元运算中实现这一点。我对三元的东西很陌生,也许你可以指导我。

if(selection.toLowerCase().equals("produkt"))
     cmdCse.setVisible(true);
else
     cmdCse.setVisible(false);

这个好像不行。

selection.toLowerCase().equals("produkt")?cmdCse.setVisible(true):cmdCse.setVisible(false);

【问题讨论】:

  • selection.toLowerCase().equals("produkt") 计算结果为 truefalse,这看起来很像您传递给 setVisible() 的值...
  • 为什么?它的可读性较差,有时构建起来并不明显(比如......在这里和为你)。当没有优势时,没有必要强行使用它(除非你要打代码高尔夫,但这对你的风格没有太大好处)。

标签: java ternary-operator ternary


【解决方案1】:

在这种情况下,您甚至不需要三元运算符:

 cmdCse.setVisible(selection.toLowerCase().equals("produkt"));

或者,更清洁:

 cmdCse.setVisible(selection.equalsIgnoreCase("produkt"));

你的版本:

selection.toLowerCase().equals("produkt")? cmdCse.setVisible(true): cmdCse.setVisible(false);

在语义上不正确:三元运算符应该表示替代赋值,它不能完全替代 if 语句。没关系:

double wow = x > y? Math.sqrt(y): x;

因为您将xMath.sqrt(y) 分配给wow取决于条件

我的 2cents:只有在使您的程序更清晰时才使用三元运算符,否则您最终会得到一些无法破译的单行符。

【讨论】:

    【解决方案2】:

    也许

    cmdCse.setVisible(selection.toLowerCase().equals("produkt"));
    

    【讨论】:

      【解决方案3】:

      三元运算符与 if 语句不完全一样。三元运算符必须从两边“返回”一些东西,所以像 setVisible() 这样的 void 方法调用是行不通的。

      相反,您完全可以在没有三元运算符的情况下执行以下操作:

      cmdCse.setVisible(selection.toLowerCase().equals("product"));
      

      但为了说明这一点,三元等价物看起来像这样:

      cmdCse.setVisible(selection.toLowerCase().equals("product") ? true : false);
      

      注意现在三元运算符如何在两边“返回”真或假,而不是简单地调用 void 方法。

      【讨论】:

        【解决方案4】:

        我认为这对你有用

        cmdCse.setVisible(selection.toLowerCase().equals("produkt"));
        

        【讨论】:

          【解决方案5】:

          直接from the docs

          使用 ?: 运算符代替 if-then-else 语句,如果它使您的代码更具可读性;例如,当表达式紧凑且没有副作用(如赋值)时。

          在您的情况下,cmdCse.setVisible(true / false); 不返回任何内容,并且该操作也有副作用(它会更改 cmdCse 的状态),因此这里不能使用条件运算符(当您使用运算符时,两者?: 分支必须具有相同的返回类型)。

          顺便说一句,请注意.. ? .. : .. 应称为conditional operator

          【讨论】:

            【解决方案6】:

            关于使用异常的问题

            我想在这里回答异常的问题,因为这个问题与another question 重复,涉及从三元表达式中抛出异常,但上述答案中没有解决这个问题。

            普遍的共识是不能像这样直接完成:

            public Character next() {
              return hasNext() ? s.charAt(cur++) : throw new NoSuchElementException(); // compilation error
            }
            

            会给你一个编译错误,但正如Clement 指出的那样,它可以通过声明的额外函数来完成。也可以通过 (ab-) 使用 lambda 表达式来完成。

            public Character next() {
              return hasNext() ? s.charAt(cur++) : ((Function<Integer, Character>) x -> {throw new NoSuchElementException();}).apply(1);
            }
            

            当然这不是那么漂亮(它非常丑陋),出于可读性的目的,我不建议这样做,但有时在某些情况下可能需要特别这样做。如果有人想出一种不使用演员表的方法,它会更具可读性。

            如果你有一个函数throwNoSuchElementException()在某个地方定义了你不止一次使用,它看起来会更具可读性:

            public Character next() {
              return hasNext() ? s.charAt(cur++) : throwNoSuchElementException();
            }
            

            (PS:为了完整起见,我包括了这个答案,因为我问自己真的不能这样做吗?)

            (P.S.S.:如果要抛出的异常不是运行时异常,这将不会那么容易工作,并且需要更多倒立 - 不值得)

            【讨论】:

            • 很酷的补充!!
            【解决方案7】:

            这是我的提示,如果你需要设置布尔值,那么简单地使用 setBoolean(condition),否则,如果你需要将变量设置为非布尔值,那么使用 var=condition?result1:result2(或变量本身,如果你不想改变条件为假),否则,使用if else。

            【讨论】:

              猜你喜欢
              • 2011-03-12
              • 2014-04-04
              • 1970-01-01
              • 2014-09-25
              • 2014-09-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多