地图后的结果类型

时间:2016-01-08 09:22:46

标签: scala dictionary

我有以下课程:

case class RolepermissionRow(roleid: Int, permissionid: Int)

case class RolePermissionJSON(
                           var id: Option[Long],
                           var num: Option[Int],
                           var name: Option[String],
                           var perms: Map[String, Boolean])

我创建了一张地图:

var s = Map("1" -> true)

我创建了一个RolePermissionJSON:

val f = RolePermissionJSON(Some(0), Some(0), Some('test'), s)

我想使用以下代码将perms Map转换为RolepermissionRow:

scala> f.perms.map { case (key, value) => if (value) RolepermissionRow(key.toInt, 1) }.toSeq
res7: Seq[Any] = List(RolepermissionRow(1,1))

结果是Seq[Any],但我希望Seq[RolepermissionRow]

2 个答案:

答案 0 :(得分:3)

需要进行简单的更改:

val z = f.perms.map { case (key, value) if (value) => RolepermissionRow(key.toInt, 1) }.toSeq

现在描述:

如果Seq RolepermissionRowvalue,则代码true包含Unit,否则为Unit。 您应该过滤出地图中的“空”元素,为您提供collect

UPD: @nafg建议使用interface I{}; class A : I{}; class B : I{}; I mything = someBoolCondition ? new A : new B; 来防止运行时出现匹配错误。

答案 1 :(得分:1)

f.perms.filter(_._2).map{case (key, value) => RolepermissionRow(key.toInt, 1) }.toSeq

我认为您应首先使用filter来过滤地图,避免空Map