练习/使用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 /等有如此多的抱怨..如果你最多使用单个元组传递给一个函数。我觉得它是我们应该使用的语言的一部分,如果它有意义和惯用的话;结束了。
答案 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。