Основная проблема заключается в том, что Scala не поддерживает описанный вами тернарный оператор. Это поддерживается Java, но в Scala нет необходимости.
В Java основное различие между if
заявлением и тройным оператором, что последний является выражением, а это означает, что она оценивается в результат, в то время как if
(как я ранее предложил) заявление, которое опирается на стороне -эффекты в пределах его возможностей, чтобы все произошло.
В Scala if
уже есть выражение, поэтому нет необходимости в тройном операторе.
Ваш код будет структурирована следующим образом:
val filteredList = list.filter { l => if (pid == "") true else l.ProviderId.toUpperCase().contains(pid.toUpperCase()) }
Как было предложено в комментарии можно дополнительно улучшить читаемость, не полагаясь на if
с, чтобы выразить простые логические условия.
val filteredList = list.filter { l => pid == "" || l.ProviderId.toUpperCase().contains(pid.toUpperCase())) }
Кроме того, в вашем случае, pid
кажется, внешними по отношению к самому списку, так что, может быть, потянув его из filter
(который имеет О (п) сложности на List
) может сэкономить вам несколько циклов:
val filteredList = if (pid.isEmpty) list else list.filter(_.ProviderId.toUpperCase().contains(pid.toUpperCase()))
Это также выглядит, как вы пытаетесь сделать случай-insensive проверку равенства на две строки, в этом случае вы можете быть заинтересованы в использовании Pattern
и не преобразования pid
в верхний регистр при каждом цикле:
val pidPattern = Pattern.compile(Pattern.quote(pid), Pattern.CASE_INSENSITIVE)
val filteredList = if (pid.isEmpty) list else list.filter(l => pidPattern.matcher(l.ProviderId).find)
Что такое 'pid'? вы имеете в виду 'l ==" "'? – mrsrinivas
Не прямой ответ на ваш вопрос, но 'if (pid ==" ") true' является избыточным. Вы можете написать это выражение как 'pid ==" "|| l.ProviderId.toUpperCase(). содержит (pid.toUpperCase()) ' –
Возможный дубликат [Тернарные операторы в Scala] (http://stackoverflow.com/questions/40643839/ternary-operators-in-scala) –