i有一个我正在使用的 */]的表格的映射[int,option [/*的某种类型的映射,因此:
scala> val t1: Map[Int,Option[(String,List[Int])]] = Map(500->Some("A",List(1,2,3)))
t1: Map[Int,Option[(String, List[Int])]] = Map(500 -> Some((A,List(1, 2, 3))))
scala> t1 + (400 -> Some("B",List(9,8,7))) + (300 -> None) + (200 -> None)
res6: scala.collection.immutable.Map[Int,Option[(String, List[Int])]] = Map(500 -> Some((A,List(1, 2, 3))), 400 -> Some((B,List(9, 8, 7))), 300 -> None, 200 -> None)
现在,我试图将所有空的值分开,一个具有所有空值-From from key/value - 而另一个没有它们,因此:
res6.span(e => e._2.isEmpty)
res7: (scala.collection.immutable.Map[Int,Option[(String, List[Int])]], scala.collection.immutable.Map[Int,Option[(String, List[Int])]]) = (Map(),Map(500 -> Some((A,List(1, 2, 3))), 400 -> Some((B,List(9, 8, 7))), 300 -> None, 200 -> None))
我不明白为什么我在左侧得到空的地图,而<k,无>对右侧的地图中充满幸福。他们应该在左边的地图中,或者我期望。
我缺少什么明显的东西?
您应该使用partition
而不是span
。
注意:c span p等于(但可能比((c在p,c dropthile p时更有效(,前提是对谓词p的评估不会引起任何副作用。
因此,如果未满足条件,span
将停止扫描。
例如,
scala> val l = List(1, 9, 8, 0)
scala> l.span(e => e < 2)
res7: (List[Int], List[Int]) = (List(1),List(9, 8, 0))
scala> l.partition(e => e < 2)
res8: (List[Int], List[Int]) = (List(1, 0),List(9, 8))
请注意,实际上,对于span
,除非订购基础收集类型,否则它可能会返回不同的运行结果。
在您的情况下, map
中的第一个元素可能不会 None
。(未订购Map
(
按照定义使用span
时,我们获得了与原始集合相同类型的序列的Tuple2
,其中一个包含true
值和其他false
值。
def span(p: A => Boolean): (Repr, Repr) =
在您的情况下
res6.span(e => e._2.isEmpty)
因此,在您的情况下,您有一个 empty
和 non-empty
tuple2的元素。
如果您想获得non-empty
值,则只需使用_2
用作
val nonEmptyValue = res6.span(e => e._2.isEmpty)._2