我在Scala中有一个List[Int]
。该列表是List(1,2,3,4,5,6,7,8,9,10)
。我想要对该列表进行filter
操作,使其只包含偶数。并且我想将这些数字乘以2。
这是否可能?
我在Scala中有一个List[Int]
。该列表是List(1,2,3,4,5,6,7,8,9,10)
。我想要对该列表进行filter
操作,使其只包含偶数。并且我想将这些数字乘以2。
这是否可能?
正如我在评论中所述,collect
应该可以满足你的需求:
list.collect{
case x if x % 2 == 0 => x*2
}
collect
方法允许您同时指定匹配元素的条件(filter
)和修改符合条件的值(map
)。
正如@TravisBrown建议的那样,您也可以使用 flatMap
,特别是在条件更复杂且不适合作为守卫条件的情况下。 对于您的示例,可以使用以下内容:
list.flatMap{
case x if x % 2 == 0 => Some(x*2)
case x => None
}
flatMap
和 Option
(在 Scala 中这也是一种常见惯用语法,因此识别它非常有用)。 - Travis BrownwithFilter
,与filter().map()
相比,它避免了一个迭代过程和创建一个经过筛选的列表作为中间步骤:list.withFilter(_ % 2 == 0).map(_ * 2)
- Sascha Kolberg以下是一个for循环推导式(在内部展开为map
和withFilter
的组合):
for (x <- xs if x % 2 == 0) yield x*2
也就是说
xs.withFilter(x => x % 2 == 0).map(x => x*2)
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)
就技术水平而言,过滤器并不那么智能(参见 List[Foo]
与 List[X]
):
scala> xs.filter { case x: Foo => true; case _ => false }
// res3: List[X] = List(Foo@4cfa8227, Foo@3f685162)
{ case x: Foo => x }
被定义为 PartialFunction[X, Foo]
。Foo
是唯一可能的返回类型,所以 collect
已经知道它必须构建一个可以包含 Foo
的列表。另一方面,filter
没有这样的类型知识。 - Adowrathp%2 == 0
时(仅获取偶数),首先进行过滤。map
将这些偶数乘以2。var myList = List(1,2,3,4,5,6,7,8,9,10).filter(p => p % 2 == 0).map(p => {p*2})
xs.foldLeft(List[Y]()) { (ys, x) =>
val z = calculateSomethingOnX(x)
if (someConditionOnZ(z))
Y(x, z) :: ys
else
ys
}
我倾向于喜欢过滤器方法。
val list1 = List(1,2,3,4,5,6,7,8,9,10)
list1.filter(x => x%2 == 0).map(_*2)
map
lambda中使用下划线。为什么你不在filter
lambda中也这样做很奇怪。 - jwvhcollect
和withFilter
比filter
和map
更高效,因为filter
和map
会迭代两次数组。 - ruloweb
collect
,它结合了filter
和map
的特性。 - cmbaxter