1

我正在用Fantom 语言编写一个 Web 应用程序,并使用afMongo访问一个 Mongo 数据库实例。按照 afMongo 文档中的示例,我得到了需要迭代的查询结果。在一个简化的例子中,迭代看起来像这样

    class MapListIterator {
      Void main(){
        [Str:Obj?][] listOfMaps := [,]
        listOfMaps.add(
          ["12345":[
             "id":12345,
             "code":"AU",
             "name":"Australia"
          ]])

        listOfMaps.each |Str:Obj? map| {
          echo(map.keys)
          keys := map.keys
          keys.each {
            echo(it)
            echo(((Str:Obj?)map[it])["code"])
            echo(((Str:Obj?)map[it])["name"])
          }
        }
      }
    }

我在Fantom 在线操场上运行了这段代码,它工作正常,但我想知道它是否是一种更清洁的方法来遍历结果。我不喜欢上面代码中的强制转换。另外,请问有没有更好的方法来编写嵌套的 it 块?

编辑:

原来我把事情复杂化了。这是应用史蒂夫的建议后代码的样子:

Str:Country mapOfCountries := [:]
mapOfCountries.ordered = true

listOfMaps := ([Str:Str?][]) collection.findAll
listOfMaps.each {
  c := it["code"]
  n := it["name"]
  mapOfCountries.add(c, Country { code = c ; name = n })
}
4

1 回答 1

1

我会重新投射结果并尽早分配地图......这给出了:

listOfMappedMaps := ([Str:[Str:Obj?]][]) listOfMaps

listOfMappedMaps.each {
    map := it
    map.keys.each {
        echo(map[it]["code"])
        echo(map[it]["name"])
    }
}

下一步将使用Morphia,它允许您使用对象代替地图。

于 2014-08-15T00:19:25.133 回答