Collections Scala集合可选元组平面图
只是练习/玩scala集合和使用partials。虽然我似乎不知道当map将正确映射到列表时如何为flatMap键入match。我知道还有其他的方法(跳到结尾),只是好奇这是如何工作的Collections Scala集合可选元组平面图,collections,tuples,optional,Collections,Tuples,Optional,只是练习/玩scala集合和使用partials。虽然我似乎不知道当map将正确映射到列表时如何为flatMap键入match。我知道还有其他的方法(跳到结尾),只是好奇这是如何工作的 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 { cas
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.U 1/2/等有这么多的抱怨不谈。。如果您最多使用一个元组来传递给函数。我觉得这是我们应该使用的语言的一部分,如果它有意义和习惯的话;结束rant。Scala
选项
不是可遍历的,因此flatMap
不起作用。不能将选项
强制转换为可遍历的。map
操作返回一个Iterable[Option[(Int,Int)]]
。2.12有一个操作展平
,您可以在映射的结果上使用该操作。它将过滤掉空的选项
s,并将非空选项转换为(Int,Int)
我不清楚您使用flatMap
想要实现什么。您想要一个Iterable[(Int,Int)]
编辑:
我忽略了隐式Option.option2Iterable:Option[A]=>Iterable[A]
,而@JustDave的语法是错误的
scala> fours.flatMap((greaterTuple _).tupled(_))
res0: scala.collection.immutable.Map[Int,Int] = Map(2 -> 8, 3 -> 12)
另请参见。您的问题是什么?那么如何将其转换为可选?我在我的答案上发布了一个编辑。是的,只是想知道这是否可行,以及为什么您会回答哪个问题。