簡體   English   中英

使用三元運算符時出錯

[英]Error using a ternary operator

如以下代碼所示,我想使用三元運算符。 但是,我收到一個錯誤消息:“;預期”,但我認為,無需添加分號。

代碼

.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;
    }
})

三元運算用於分配或返回值, continue; 是一條指令,為了使其簡單易用,請使用以下命令:

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

首先,您不能在三元條件下使用continue ,因為continue是語句,而不是表達式,正如三元條件所期望的那樣。 此處更多有關表達式語句的信息 (提供給@Andreas

我的建議而不是嘗試使用三元條件,而是使用Java流,因為您已經在使用filter和謂詞:

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

這與您嘗試收集以b開頭的字符串的結果相同。

條件運算符? : ? :表達式 ,而不是語句 (請參見JLS 15.25。條件運算符? : :)

表達式不能寫為語句,即以下兩個都是無效的:

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

請注意,只有某些表達式也可用作語句,並且? : ? :不是其中之一( JLS 14.8。Expression語句 ):

 ExpressionStatement: StatementExpression ; StatementExpression: Assignment PreIncrementExpression PreDecrementExpression PostIncrementExpression PostDecrementExpression MethodInvocation ClassInstanceCreationExpression 

此外,條件運算符的語法為:

 ConditionalOrExpression ? Expression : ConditionalExpression ConditionalOrExpression ? Expression : LambdaExpression 

這意味着所有3個部分都必須是expressions ,而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);
}

首先,三元運算用於分配或返回值,continue是一條指令。

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

替換為

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM