Scala中地图中的多个用于理解

时间:2014-05-28 03:47:47

标签: scala

这是函数,

def checkSupport(request: checkSupportRequest): Future[checkSupportResponse] = {
  val lookupClient = Thrift.newIface[lookupClient[Future]](/*some initializers*/)
  val req = lookupIPRequest(request.getIps, /*Unimportant variables*/)
  var result = new checkSupportResponse()

  lookupClient.performLookup(req).map { resp =>
    // Returns a map of IP to Country Code (String:String)
    val ip_cc_map = for {
      (ip, lxn) <- resp.found
       sr <- lxn.simpleResult
      cc <- sr.countryCode
    } yield (ip, cc)
     // Returns a map of IP to Boolean (String:Boolean)
    val not_found_map = for {
      (ip) <- resp.notFound
    } yield (ip, false)

    val op_supp_temp_map = ip_cc_map.map {
      case (ip, cc) => someLookup(cc) //This returns a boolean value 
    }
    val op_supp_map = op_supp_temp_map.toList //List of Booleans
    val ips_found = ip_cc_map.map { // Intended to become a list of IPs
      case (ip, cc) => ip
    }
    val final_op_supp_map = ips_found zip op_supp_map // Converted to Map (String:Boolean)

    final_map = final_op_supp_map ++ not_found_map

    result.set_supported(final_result.toList.toMap.mapValues(Boolean.box))
  }
  Future.value(result)
}

performLookup是一个未来化的电话。如上所述做事是犹太教的,即接受未来电话的输出并映射它。执行两次背靠背以获得对其的理解以获得必要的地图,然后在相同的地方执行,将两个结果组合并返回相同的结果。出于某种原因,这会编译但是当我尝试对其进行单元测试时,看起来好像performLookup从未运行过。任何帮助将不胜感激。

此外,我正在我的单元测试中,在checkSupport()调用上执行Await.result()。

1 个答案:

答案 0 :(得分:2)

我假设您Future.value(result)实际上是Future.successful(result)

闭包内的result变量与其外的result变量不同,因此您永远不会实际修改您声明的result变量在你的功能开始。所以这就是为什么看起来你的Future从未跑过。

作为旁注,即使你改变了result的状态,也不需要将其声明为varval在这里很好({{只有通过执行var)重新分配它才会有必要。

所以你可以像这样修改你的功能:

result = ...