使用三元运算符时出错

时间:2018-07-18 15:16:05

标签: java android

如以下代码所示,我想使用三元运算符。但是我收到一个错误消息:“;预期”,但是我认为不需要添加分号。

代码

.filter(new Predicate<List<String>>() {
    @Override
    public boolean test(@NonNull List<String> strings) throws Exception {
        List<String> lst = new ArrayList<String>();
        for (String string : strings) {
            Log.i(TAG, ".filter(): string: " + string);
            string.toLowerCase().startsWith("b") ? lst.add(string): continue;
        }
        Log.i(TAG, ".filter(): lsr: " + lst);
        return lst.size() > 0;
    }
})

4 个答案:

答案 0 :(得分:2)

三元运算用于分配或返回值,continue;是一条指令,使用类似以下的命令使其简单易用:

if(string.toLowerCase().startsWith("b")) {
    lst.add(string); 
} else {  
    continue;
}

答案 1 :(得分:2)

首先,您不能在三元条件下使用continue,因为continue是语句,而不是表达式,正如三元条件所期望的那样。有关表达式语句here的更多信息(贷记@Andreas

我的建议而不是尝试使用三元条件,而是使用Java流,因为您已经在使用filter和谓词:

.filter(strings -> strings.stream()
                          .anyMatch(string -> string.toLowerCase().startsWith("b")));

这与您尝试收集以b开头的字符串的结果相同。

答案 2 :(得分:0)

条件运算符? :表达式,而不是声明(请参见JLS 15.25. Conditional Operator ? :)。

表达式不能被写为语句,即以下两种都是无效的:

2 + 7;
a == 42 ? foo() : bar();

请注意,只有某些表达式也可用作语句,并且? :不是其中之一(JLS 14.8. Expression Statements):

ExpressionStatement:
  StatementExpression ;

StatementExpression:
  Assignment
  PreIncrementExpression
  PreDecrementExpression
  PostIncrementExpression
  PostDecrementExpression
  MethodInvocation
  ClassInstanceCreationExpression

此外,条件运算符的syntax为:

ConditionalOrExpression ? Expression : ConditionalExpression
ConditionalOrExpression ? Expression : LambdaExpression

这意味着所有3个部分都必须是表达式,而continue是语句,而不是表达式。

总而言之,? :是一个表达式,不能用作语句,并且只能包含表达式,不能包含语句。它不能代替if语句。

因此,您的代码应使用if语句编写:

for (String string : strings) {
    Log.i(TAG, ".filter(): string: " + string);
    if (string.toLowerCase().startsWith("b")) {
        lst.add(string);
    } else {
        continue;
    }
}

当然,在循环结束时使用continue语句是多余的(循环继续进行),因此可以删除else

for (String string : strings) {
    Log.i(TAG, ".filter(): string: " + string);
    if (string.toLowerCase().startsWith("b"))
        lst.add(string);
}

答案 3 :(得分:0)

首先,三元运算用于分配或返回值,继续是一条指令。

string.toLowerCase().startsWith("b") ? lst.add(string): continue;

替换此行

if(string.toLowerCase().startsWith("b"))
     lst.add(string);
else
     continue;