按类型过滤集合的最佳方法是什么?

时间:2018-04-01 17:23:58

标签: scala

按类型过滤集合的最佳方法是什么? 我希望结果类型是已过滤的类型。 我找到了两种可能的语法,哪种更好?

val list = List(1,"two",3,"four")

//1) using "Typed" helper object

object Typed { def unapply[A](a: A) = Some(a) }

val list1 = for {
  Typed(i: Int) <- list
} yield i


//2) using flatMap

val list2 = lo.flatMap {
    case i: Int => List(i)
    case _ => Nil
}

2 个答案:

答案 0 :(得分:5)

使用collect

list.collect {
  case a: Int => a
}

答案 1 :(得分:0)

如果您忘记了collect,使用filter代替flatMap仍然应该更短&amp;更快:

val list2 = lo.filter {
    case i: Int => true
    case _ => false
}.asInstanceOf[List[Int]]

如果我们不假装模式匹配与执行isInstanceOf有明显不同之处,我们也可以这样做:

val list2 = lo.filter(_.isInstanceOf[Int]).asInstanceOf[List[Int]]

这不是很惯用,但是... pamu的解决方案肯定更优雅。