我在List[Int]
中有Scala
。列表是List(1,2,3,4,5,6,7,8,9,10)
。我想filter
列表,以便它只有偶数。而且我想用2来代表数字。这有可能吗?
我希望我已经清楚地解释了这个问题。如果您有任何疑问,请询问。提前谢谢。
答案 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(内部展开为map
和withFilter
的组合),如下所示,
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
}