如何在Scala中合并filter和map?

5jdjgkvh  于 2023-05-29  发布在  Scala
关注(0)|答案(6)|浏览(166)

我在Scala中有List[Int]。列表为List(1,2,3,4,5,6,7,8,9,10)。我想filter列表,使它只有偶数。我想把这些数字乘以2。
这可能吗?

mw3dktmi

mw3dktmi1#

正如我在评论中所说,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
}
xbp102n0

xbp102n02#

A用于理解(其内部展开为mapwithFilter的组合),如下所示,

for (x <- xs if x % 2 == 0) yield x*2

xs.withFilter(x => x % 2 == 0).map(x => x*2)
xeufq47z

xeufq47z3#

正如@cmbaxter所说,收集完全适合你的需要。collect的另一个好处是,如果你按类过滤,它会计算出结果类型:

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)
km0tfn4u

km0tfn4u4#

这应该为你做的工作:
当条件为p % 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})
ehxuflar

ehxuflar5#

我倾向于喜欢过滤器的方法。

val list1 = List(1,2,3,4,5,6,7,8,9,10)
list1.filter(x => x%2 == 0).map(_*2)
2jcobegt

2jcobegt6#

来个老式的折叠怎么样?

xs.foldLeft(List[Y]()) { (ys, x) => 
    val z = calculateSomethingOnX(x)
    if (someConditionOnZ(z)) 
        Y(x, z) :: ys
    else 
        ys
}

相关问题