如何在地图Scala中跳过附加某些条件?

phi*_*eas 5 collections scala immutability

我遇到一种情况,我需要通过在内部应用一些过滤器来从集合中创建地图,如下面的代码所示:

//Say I have a list
//I don't have to apply filter function ...

val myList = List(2,3,4,5)

val evenList = myList.map(x=>{
if ( x is even) x
else 0
}
//And the output is : List(2,0,4,0)
//The output actually needed was List(2,4) without applying filter on top like - ```myList.filter```
//I have objects instead of numbers of a case class so the output becomes :List(object1, None, object2, None)
But actual output needed was : List(object1,object2)
Run Code Online (Sandbox Code Playgroud)

//更新后的场景

val basket = List(2,4,5,6)
case class Apple(name:Option[String],size:Option[Int])

val listApples: List[Apple] = basket.map(x=>{

  val r = new scala.util.Random
  val size = r.nextInt(10)

  if(x%2!=0){
    Apple(None,None)
  }
  else Apple(Some("my-apple"),Some(size))
})

Run Code Online (Sandbox Code Playgroud)

电流输出

Apple(Some(my-apple),Some(2))
Apple(Some(my-apple),Some(0))
Apple(None,None)
Apple(Some(my-apple),Some(4))
Run Code Online (Sandbox Code Playgroud)
Expected was :
Apple(Some(my-apple),Some(2))
Apple(Some(my-apple),Some(0))
Apple(Some(my-apple),Some(4))
Run Code Online (Sandbox Code Playgroud)

pme*_*pme 5

我不确定我是否理解正确,但为什么不filter直接使用 a :

val myList = List(2,3,4,5)

myList.filter(_ % 2 == 0)
Run Code Online (Sandbox Code Playgroud)

如果您想将过滤器作为函数:

def even(n:Int) = n % 2 == 0

myList.filter(even) 
Run Code Online (Sandbox Code Playgroud)

问题更新后filter,这里和 之间的区别collect

筛选:

  myList
    .filter(even) 
    .map(s => Apple(Some("my-apple"),Some(s)))
Run Code Online (Sandbox Code Playgroud)

收集:

myList
    .collect{ case s if(even(s)) => Apple(Some("my-apple"),Some(s))}
Run Code Online (Sandbox Code Playgroud)

均返回List(Apple(Some(my-apple),Some(2)), Apple(Some(my-apple),Some(4)))

所以唯一的区别是您可以使用 一次执行这两个步骤collect

然而对我来说,将这两个步骤分开主要是更具可读性。


Krz*_*sik 5

我相信collect最适合您的情况。它使用部分函数作为参数,并且仅当该函数匹配时,元素才被转换并添加到结果中:

val myList = List(2,3,4,5)

case class Wrapper(i: Int)

val evenList = myList.collect{
  case x if x % 2 == 0 => Wrapper(x)
}
Run Code Online (Sandbox Code Playgroud)

仅在这种情况下24将被包装在里面Wrapper

List(Wrapper(2), Wrapper(4))
Run Code Online (Sandbox Code Playgroud)