三元运算符 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")
计算结果为 true
或 false
,这看起来很像您传递给 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;
因为您将x
或Math.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的主要内容,如果未能解决你的问题,请参考以下文章