为什么三元操作必须返回值?

时间:2018-11-03 22:08:24

标签: java compilation ternary-operator

我已经阅读了相关的问题和答案(例如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);
}

这当然不是编译的。

2 个答案:

答案 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>  }