三元运算符 Java

Posted

技术标签:

【中文标题】三元运算符 Java【英文标题】:Ternary Operators 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() 的值... 为什么?它的可读性较差,有时构建起来并不明显(比如......在这里和为你)。当没有优势时,没有必要强行使用它(除非你要打代码高尔夫,但这对你的风格没有太大好处)。 【参考方案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。

【讨论】:

以上是关于三元运算符 Java的主要内容,如果未能解决你的问题,请参考以下文章

Java 多三元运算符

从0开始学大数据-Java基础-三元运算符/键盘录入

如何使用 Java Optional 优雅地替换三元运算符

JAVA-初步认识-第三章-三元运算符

在 java 澄清中使用 += 和三元运算符

★Java语法——————————三元运算符