我想展平一系列集合:
val test = for(i <- 1 to 3) yield {
if(i == 1)
Set.empty
else
Set(9, 1)
}
val b = test.flatten
这失败了:
ScalaFiddle.scala:7:错误:没有可用的隐式视图 scala.collection.immutable.Set [_&lt;:Int] =&gt; scala.collection.GenTraversableOnce [B]。 val b = test.flatten ^ ScalaFiddle.scala:7:错误:方法flatten的参数不够:(隐式asTraversable: scala.collection.immutable.Set [_&lt;:Int] =&gt; scala.collection.GenTraversableOnce [B])scala.collection.immutable.IndexedSeq [B]。 未指定的值参数asTraversable。 val b = test.flatten
但真正令我困惑的是为什么这会起作用?:
val test = for(i <- 1 to 3) yield {
if(i == 1)
Set.empty
else
Set(9, 1)
}
println(test.flatten)
// compiles and prints Vector(9, 1, 9, 1) when run
所以我的问题是:println(test.flatten)
中的展平与val b = test.flatten
中的展平之间的区别是什么?
答案 0 :(得分:1)
感谢Michael Zajac的评论我得到了它。
无论
val test = for(i <- 1 to 3) yield {
if(i == 1)
Set.empty[Int]
else
Set(9, 1)
}
val b = test.flatten
或
val test = for(i <- 1 to 3) yield {
if(i == 1)
Set.empty
else
Set(9, 1)
}
val b: Seq[Int] = test.flatten
应该有效。在Set.empty
上设置类型或告诉编译器我们期望val b
的类型。
答案 1 :(得分:1)
或者,应该可以在Set
中反转您的情况并使其成为警卫,并在那里使用您的val b = for {
i <- 1 to 3
if i != 1
j <- Set(9, 1)
} yield j
// b: scala.collection.immutable.IndexedSeq[Int] = Vector(9, 1, 9, 1)
:
nativeEvents