Scala:将地图分配编译为特定类型而不是Any

时间:2014-09-16 03:42:15

标签: scala

执行一些hackish函数式编程,编译器似乎坚持认为此代码生成的类型为List[Map[String, Any]

val found = emits map (m => Map("match" -> m("match"), 
                                "indication" -> patterns.find(pattern => pattern._2.exists(fragment => fragment == m("match"))).get._3))

我想这很容易归因于编译器无法确定要分配给地图键值对的一个或多个值的类型;地图的键明显是字符串,但不知何故编译器未能意识到用于值的表达式也必然是字符串。

这很酷,但我的函数需要返回此值found。只要Scala是类型安全的,返回List[Map[String, String]]比返回List[Map[String, Any]]更好。那么,如果不过分努力工作CPU,那么最干净最优雅的方法是什么呢?

1 个答案:

答案 0 :(得分:1)

假设find返回Option[String],您需要添加一个默认大小写,以便您的值为#34;指示"应该看起来像:

patterns.find( /*your logic*/) getOrElse "Not Indicated"

如果find返回Some(x),则getOrElse将仅返回值x。如果find返回None,则getOrElse将返回"Not Indicated"。现在你的地图包含一个字符串和一个Option [String],这两个最近的共同祖先是Any。

在选项上使用get也是不好的做法,因为它不是空的安全。使用getOrElse或以另一种方式重构。