Java 为什么三元运算必须返回一个值?

Java 为什么三元运算必须返回一个值?,java,compilation,ternary-operator,Java,Compilation,Ternary Operator,我读过相关的问题和答案(例如)。但他们关心的是,是否有可能在不赋值的情况下使用三元运算。我的问题是,为什么Java不支持它?是否有一些与汇编有关的根本原因?有支持它的编程语言吗 我问的原因是因为一份声明 <condition> ? <do this if true> : <do that if false> ?: 不仅更加优雅,节省了4行代码,而且与 value = <condition> ? <this if true> : &l

我读过相关的问题和答案(例如)。但他们关心的是,是否有可能在不赋值的情况下使用三元运算。我的问题是,为什么Java不支持它?是否有一些与汇编有关的根本原因?有支持它的编程语言吗

我问的原因是因为一份声明

<condition> ? <do this if true> : <do that if false>
?:
不仅更加优雅,节省了4行代码,而且与

value = <condition> ? <this if true> : <that if false>
value=?:
以下是市场数据订单簿实现的一个实际示例:

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 TreeMap bids=new TreeMap(Collections.reverseOrder());
public TreeMap asks=new TreeMap();
公共无效报价(布尔isBid、整数价格、整数大小){
地图册=isBid?投标:询问;
如果(大小==0){
删除(价格);
}否则{
账面价值(价格、大小);
}
}
}
这里有一个解决方法:

public void quote(boolean-isBid、int-price、int-size){
地图册=isBid?投标:询问;
@抑制警告(“未使用”)
整数sizePrevious=(大小==0)?book.remove(价格):book.put(价格,大小);
}
但它看起来更优雅,就像这样:

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);
}
public void quote(boolean-isBid、int-price、int-size){
地图册=isBid?投标:询问;
(大小==0)?book.remove(价格):book.put(价格,大小);
}
这当然不是编译。

问题在于:

第一个表达式必须是boolean或boolean类型,否则会发生编译时错误

第二个或第三个操作数表达式调用void方法是编译时错误

没有什么能阻止不同的JVM语言处理
foo?bar():baz()
以您想要的方式将bar和baz
null
作为条件。在某种程度上,Kotlin使用相同的结构来调用函数和返回值:

效果和你的一样好

Kotlin语言设计者可以很容易地选择在Java
a?b:c
样式中使用条件运算符,但这可能被认为更具可读性和表达性。

这是不允许的:

?:
可以这样写:

if (<condition>) { <do this if true> } else { <do this if false> }
if (<condition>) { value = <this if true>} else { value = <this if false>  }
if(){}else{}
这不是更优雅更易读吗

另一方面,这(这是允许的):

value=?:
可以这样写:

if (<condition>) { <do this if true> } else { <do this if false> }
if (<condition>) { value = <this if true>} else { value = <this if false>  }
if(){value=}else{value=}
你可以选择你喜欢的任何东西

在没有三元运算符的Kotlin中,您可以使用更优雅的方式:

value = if (<condition>) { <this if true>} else { <this if false>  }
value=if(){}else{}

这只是一个选择,就像在JavaLeague的创建过程中所做的数千个其他选择一样,它在旁观者的眼中。定义运算符必须执行的操作。如果一个实现选择做其他事情,它将不是Java。链接指出,事实上,根据表达式语句()的语法,条件表达式不允许出现在任何可能出现void方法调用的上下文中。副作用也可以被视为反模式,特别是函数编程纯粹主义者。你也可以问,一个操作是否应该返回一个值,以及void方法实际上有多优雅。@MickMemmonic,在某些阶段,不是总有一些东西不会返回任何东西吗?感谢您的回答,但是
{}
的解决方法并不是很优雅,因为它是一种非传统的代码样式。而在
{}
内赋值需要在if/else范围外声明。对于以下简单语句,括号不是必需的:
if(true)value=0;else值=0是的,我们可以这样编写整个代码,但这也是非常规的代码风格。你为什么觉得它非常规?我个人更喜欢Kotlin的方法,正如我提到的,这里没有三元运算符。但这就是Java的结构方式。
value = <condition> ? <this if true> : <that if false>
if (<condition>) { value = <this if true>} else { value = <this if false>  }
value = if (<condition>) { <this if true>} else { <this if false>  }