Scala Collections可选元组flatMap

时间:2017-07-05 18:28:51

标签: collections tuples optional

练习/使用scala集合并使用partials。虽然当地图正确映射到列表时,我似乎无法弄清楚如何为flatMap键入匹配。我知道还有其他方法(跳到结束)只是好奇这是如何工作的。

val fours = Map( 1 -> 4, 2 -> 8, 3 -> 12)
def greaterTuple( k:Int, v:Int):Option[(Int, Int)] = if(v > 4) Some(k,v) else None

fours.flatMap { case (k,v) => greaterTuple(k,v) }  //works
fours.flatMap( x => greaterTuple(x._1, x._2))      //works
fours.map( (greaterTuple _).tupled)                //works

fours.flatMap( (greaterTuple _).tupled)    

 Error:(27, 56) type mismatch;
 found   : ((Int, Int)) => Option[(Int, Int)]
 required: ((Int, Int)) => scala.collection.GenTraversableOnce[?]

除了将函数签名更改为

之外
def greaterTuple( t: (Int,Int)):Option[(Int,Int)] = if(t._2 > 4) Some(t) else None

让一切变得轻松

fours.flatMap(greaterTuple)
fours.map(greaterTuple)

或在有人建议之前:内联整个事情不是我的观点

fours.filter(t => t._2 > 4) 

那你怎么键入把它作为可选项?

也许你不用担心,除了前面提到的

fours.flatMap { case (k,v) => greaterTuple(k,v) }

**除了为什么对t._1 / 2 /等有如此多的抱怨..如果你最多使用单个元组传递给一个函数。我觉得它是我们应该使用的语言的一部分,如果它有意义和惯用的话;结束了。

1 个答案:

答案 0 :(得分:0)

Scala Option不是可遍历的,因此flatMap无法正常工作。您无法将Option投射到遍历中。 map操作返回Iterable[Option[(Int, Int)]]。 2.12有一个操作flatten,您可以使用map的结果。它会过滤掉空的Option并将非空的转换为(Int, Int)

我不清楚您使用flatMap尝试实现的目标。你想要Iterable[(Int, Int)]吗?

修改

我忽略了implicit Option.option2Iterable: Option[A] => Iterable[A],@ JustDave的语法错了。

scala> fours.flatMap((greaterTuple _).tupled(_))
res0: scala.collection.immutable.Map[Int,Int] = Map(2 -> 8, 3 -> 12)

另见this