条件运算符()

句法

{condition-to-evaluation} {statement-executed-on-true} {statement-executed-on-false}

如语法所示,条件运算符(也称为三元运算符 1 )使用 ?(问号)和:(冒号)字符来启用两个可能结果的条件表达式。它可用于替换较长的 if-else 块,以根据条件返回两个值中的一个。

result = testCondition ? value1 : value2

相当于

if (testCondition) { 
    result = value1; 
} else { 
    result = value2; 
}

它可以读作 “如果 testCondition 为 true,则将结果设置为 value1; 否则,将结果设置为 value2“。

例如:

// get absolute value using conditional operator 
a = -10;
int absValue = a < 0 ? -a : a;
System.out.println("abs = " + absValue); // prints "abs = 10"

相当于

// get absolute value using if/else loop
a = -10;
int absValue;
if (a < 0) {
    absValue = -a;
} else {
    absValue = a;
}
System.out.println("abs = " + absValue); // prints "abs = 10"

常见用法

你可以使用条件运算符进行条件赋值(如 null 检查)。

String x = y != null ? y.toString() : ""; //where y is an object

这个例子相当于:

String x = "";

if (y != null) {
    x = y.toString();
}

由于条件运算符具有第二低的优先级,在赋值运算符之上,很少需要在条件周围使用括号,但是当与其他运算符组合时,需要在整个条件运算符构造周围使用括号 :

// no parenthesis needed for expressions in the 3 parts
10 <= a && a < 19 ? b * 5 : b * 7

// parenthesis required
7 * (a > 0 ? 2 : 5)

条件运算符嵌套也可以在第三部分中完成,其中它更像链接或像 switch 语句。

a ? "a is true" :
b ? "a is false, b is true" :
c ? "a and b are false, c is true" :
    "a, b, and c are false"

//Operator precedence can be illustrated with parenthesis:

a ? x : (b ? y : (c ? z : w))

脚注:

1 - Java 语言规范Java 教程都将(? :)运算符称为条件运算符。该教程说它也称为三元运算符,因为它(目前)是 Java 定义的唯一三元运算符。 条件运算符术语与 C 和 C++以及具有等效运算符的其他语言一致。