Я пытаюсь преобразовать список с помощью серии вызовов фильтра и карты. Логика фильтра снова используется в вызове карты, и я хочу избежать этого дублирующего вызова. Я думаю, что код хорошо подводит итог:
fun main(args: Array<String>) {
multipleCalls()
wontCompile()
}
fun multipleCalls(){
val arr = intArrayOf(1,2,3)
val list = arr.filter{
it.heavyLogic() != null
}.map{
it.heavyLogic() //heavyLogic() called again
}
print(list)
}
fun wontCompile(){
val arr = intArrayOf(1,2,3)
val list = arr.map{
val str = it.heavyLogic()
if(str == null) continue //break and continue are only allowed inside a loop
else str
}
print(list)
}
Есть ли эквивалент карты break / continue внутри карты, который может исправить wontCompile()
?
Я понимаю, что у меня также может быть map
return null
s, в результате чего получается list
типа List<String?>
- и затем filter
на null
. Но это все еще повторяет список дважды.