如何在scala中组合过滤器和地图?

时间:2015-08-26 18:32:05

标签: scala dictionary filter

我在List[Int]中有Scala。列表是List(1,2,3,4,5,6,7,8,9,10)。我想filter列表,以便它只有偶数。而且我想用2来代表数字。这有可能吗?

我希望我已经清楚地解释了这个问题。如果您有任何疑问,请询问。提前谢谢。

6 个答案:

答案 0 :(得分:43)

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

答案 1 :(得分:6)

A for comprehension(内部展开为mapwithFilter的组合),如下所示,

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

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

答案 2 :(得分:1)

正如@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)

与众不同,过滤器不是那么聪明(请参阅List[Foo] vs List[X]):

scala> xs.filter { case x: Foo => true; case _ => false }
// res3: List[X] = List(Foo@4cfa8227, Foo@3f685162)

答案 3 :(得分:0)

这应该为你做的工作:

条件为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})

答案 4 :(得分:0)

我倾向于喜欢过滤方法。

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

答案 5 :(得分:0)

好的老式褶皱怎么样?

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