我正在尝试将Java的代码片段转换为Scala。它是无限的树状结构。
class Node {
public Node(Map<String, Node> routes) {}
}
class Factory {
public Map<String, Node> buildRoutes() {
Map<String, Node> routes = new HashMap<>();
asList("one", "two").forEach(key -> routes.put(key, new Node(routes));
return routes;
}
运行正常。将上面的片段翻译成Scala之后,我发现Map出现了问题。看起来在Scala中,可变地图和不可变地图不兼容。
因此,我必须在字段Node中使用可变映射类型。对于我来说,这看起来很奇怪,因为我的地图不可变。它在Node中没有更改,Node必须稍微了解其应有的依赖性。
import scala.collection.mutable
case class Node(routes: mutable.Map[String, Node])
object Factory {
def buildRoutes(): mutable.Map[String, Node] = {
val routes = new mutable.HashMap[String, Node]
List("one", "two").foreach(key => routes.put(key, Node(routes)))
routes
}
}
我很高兴看到Node.routes是不可变映射的替代解决方案。
这里没有什么可变的:
class Node(unfold: => Map[String, Node]) {
def routes: Map[String, Node] = unfold
}
object Factory {
def buildRoutes: Map[String, Node] = {
def fix: Map[String, Node] =
List("one", "two").map(_ -> new Node(fix)).toMap
fix
}
}
它构建时不带StackOverflowError
s,并且仍然无限展开:
val rs = Factory.buildRoutes
println(rs("one").routes("one").routes("two").routes("one").routes.keys)
关键是作用域中的函数定义可以递归引用自己。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句