list flatMap { i => Option(i.accept(this, arg).asInstanceOf[T]) }
или, если хотите, альтернативно (хотя это будет более или менее преобразовано в исходное выражение)
for {
item <- list
itemConverted = item.accept(this, arg).asInstanceOf[T]
itemNonNull = itemConverted if itemConverted != 0
} yield itemNonNull
Использование collect
было бы возможно, но, скорее всего, вызовет accept
дважды по большинству аргументов из-за теста isDefinedAt
частичной функции:
list collect {
case i if i.accept(this, arg).asInstanceOf[T] != null => i.accept(this, arg).asInstanceOf[T]
}
Чтобы избежать этого, нужно использовать некоторые заметки (или умные экстракторы).