我已经阅读了相关的问题和答案(例如here)。但是它们是关于是否可以在不分配的情况下使用三元运算。我的问题是 为什么 ,Java不支持它?是否有一些与编译相关的根本原因?有支持它的编程语言吗?
我问的原因是因为一个声明
<condition> ? <do this if true> : <do that if false>
不仅更优雅,并节省了4行代码,而且与
也没有太大不同value = <condition> ? <this if true> : <that if false>
以下是实施市场数据订单的实际示例:
public class OrderBook {
public TreeMap<Integer, Integer> bids = new TreeMap<>(Collections.reverseOrder());
public TreeMap<Integer, Integer> asks = new TreeMap<>();
public void quote(boolean isBid, int price, int size) {
Map<Integer, Integer> book = isBid ? bids : asks;
if (size == 0) {
book.remove(price);
} else {
book.put(price, size);
}
}
}
这是一个解决方法:
public void quote(boolean isBid, int price, int size) {
Map<Integer, Integer> book = isBid ? bids : asks;
@SuppressWarnings("unused")
Integer sizePrevious = (size == 0) ? book.remove(price) : book.put(price, size);
}
但是看起来会更优雅:
public void quote(boolean isBid, int price, int size) {
Map<Integer, Integer> book = isBid ? bids : asks;
(size == 0) ? book.remove(price) : book.put(price, size);
}
这当然不是编译的。
答案 0 :(得分:4)
这是specification的问题:
第一个表达式必须为布尔型或布尔型,否则会发生编译时错误。
第二个操作数表达式或第三个操作数表达式调用void方法都是编译时错误。
没有什么可以阻止不同 JVM语言以bar和baz foo ? bar() : baz()
作为条件来处理null
的情况。按照这些思路,Kotlin的conditionals使用相同的结构来调用函数和返回值:
val max = if (a > b) a else b
和
一样好if (a>b) a() else b()
Kotlin语言设计人员可以很容易地选择使用Java a?b:c
风格的条件运算符,但是它可能被认为更具可读性和表达力。
答案 1 :(得分:0)
这(不允许):
<condition> ? <do this if true> : <do this if false>
可以这样写:
if (<condition>) { <do this if true> } else { <do this if false> }
这不是更优雅和可读吗?
另一方面(允许):
value = <condition> ? <this if true> : <that if false>
可以这样写:
if (<condition>) { value = <this if true>} else { value = <this if false> }
您可以选择任何自己喜欢的东西。
在没有三元运算符的Kotlin中,您可以使用更优雅的方法:
value = if (<condition>) { <this if true>} else { <this if false> }