scala - 在Scala中, map 和过滤器的组合无效

是否可以通过在一次调用中表示map和null跳过的方式来表达以下代码?

list.map(_.accept(this, arg).asInstanceOf[T]).filter(_ != null)

最佳答案

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]
}

人们可能需要使用一些备忘(或智能提取器)来避免这种情况。