scala> trait X
// defined trait X
scala> class Foo extends X
// defined class Foo
scala> class Bar extends X
// defined class Bar
scala> val xs = List(new Foo, new Bar, new Foo, new Bar)
// xs: List[X] = List(Foo@4cfa8227, Bar@78226c36, Foo@3f685162, Bar@11f406f8)
scala> xs.collect { case x: Foo => x }
// res1: List[Foo] = List(Foo@4cfa8227, Foo@3f685162)
一般来说,filter不可能那么智能(参见List[Foo] vs List[X]):
scala> xs.filter { case x: Foo => true; case _ => false }
// res3: List[X] = List(Foo@4cfa8227, Foo@3f685162)
6条答案
按热度按时间mw3dktmi1#
正如我在评论中所说,
collect
应该做你想要的:collect
方法允许您指定匹配元素的条件(filter
),并修改匹配的值(map
)正如@TravisBrown所建议的,您也可以使用
flatMap
,特别是在条件更复杂且不适合作为保护条件的情况下。例如:xbp102n02#
A用于理解(其内部展开为
map
和withFilter
的组合),如下所示,即
xeufq47z3#
正如@cmbaxter所说,收集完全适合你的需要。collect的另一个好处是,如果你按类过滤,它会计算出结果类型:
一般来说,filter不可能那么智能(参见
List[Foo]
vsList[X]
):km0tfn4u4#
这应该为你做的工作:
当条件为
p % 2 == 0
时,首先进行过滤(仅获取偶数)。然后使用
map
将这些偶数乘以2。ehxuflar5#
我倾向于喜欢过滤器的方法。
2jcobegt6#
来个老式的折叠怎么样?