三元 vs Java
Ternary vs if in Java
为什么像这样使用三元是不正确的,而使用 if 是正确的?
//Error when using as ternary
Character.isDigit(myDto.getNameStr().charAt(0)) ? digitArrayList.add(myDto) : charArrayList.add(myDto);
//OK when used as if ... else
char c = myDto.getNameStr().charAt(0);
if(Character.isDigit(c)) {
digitArrayList.add(myDto);
} else {
charArrayList.add(myDto);
}
不允许将三元条件作为独立语句使用。仅允许某些表达式作为独立语句,例如赋值或方法调用。
JLS 将那些允许作为独立语句的表达式分类为 StatementExpression
:
Assignment
PreIncrementExpression
PreDecrementExpression
PostIncrementExpression
PostDecrementExpression
MethodInvocation
ClassInstanceCreationExpression
这里有一些晦涩的方法可以使用三元组:
// statement is an assignment
boolean ignored =
Character.isDigit(...) ?
digitArrayList.add(myDto) : charArrayList.add(myDto);
// statement is a method invocation
(Character.isDigit(...) ? digitArrayList : charArrayList)
.add(myDto);
但我不推荐使用那些,它们真的只是一种好奇。只使用 if...else
.
更清楚
三元运算符的根本目的是将多行 if..else 条件压缩为单行。这样就增加了代码的可读性。三元运算符也称为条件赋值运算符,所以这里如果你不赋值。所以它给出了错误。
要让您的代码使用三元运算符,您可以像下面这样修改代码
boolean result = Character.isDigit(myDto.getNameStr().charAt(0)) ? digitArrayList.add(myDto) : charArrayList.add(myDto);
最好的做法是把这种代码分成if...else代码块
为什么像这样使用三元是不正确的,而使用 if 是正确的?
//Error when using as ternary
Character.isDigit(myDto.getNameStr().charAt(0)) ? digitArrayList.add(myDto) : charArrayList.add(myDto);
//OK when used as if ... else
char c = myDto.getNameStr().charAt(0);
if(Character.isDigit(c)) {
digitArrayList.add(myDto);
} else {
charArrayList.add(myDto);
}
不允许将三元条件作为独立语句使用。仅允许某些表达式作为独立语句,例如赋值或方法调用。
JLS 将那些允许作为独立语句的表达式分类为 StatementExpression
:
Assignment
PreIncrementExpression
PreDecrementExpression
PostIncrementExpression
PostDecrementExpression
MethodInvocation
ClassInstanceCreationExpression
这里有一些晦涩的方法可以使用三元组:
// statement is an assignment
boolean ignored =
Character.isDigit(...) ?
digitArrayList.add(myDto) : charArrayList.add(myDto);
// statement is a method invocation
(Character.isDigit(...) ? digitArrayList : charArrayList)
.add(myDto);
但我不推荐使用那些,它们真的只是一种好奇。只使用 if...else
.
三元运算符的根本目的是将多行 if..else 条件压缩为单行。这样就增加了代码的可读性。三元运算符也称为条件赋值运算符,所以这里如果你不赋值。所以它给出了错误。
要让您的代码使用三元运算符,您可以像下面这样修改代码
boolean result = Character.isDigit(myDto.getNameStr().charAt(0)) ? digitArrayList.add(myDto) : charArrayList.add(myDto);
最好的做法是把这种代码分成if...else代码块