Collections Scala集合可选元组平面图

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

只是练习/玩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 { 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)

另请参见。

您的问题是什么?那么如何将其转换为可选?我在我的答案上发布了一个编辑。是的,只是想知道这是否可行,以及为什么您会回答哪个问题。