Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala中地图中的多个理解_Scala - Fatal编程技术网

Scala中地图中的多个理解

Scala中地图中的多个理解,scala,Scala,这是函数 def checkSupport(request: checkSupportRequest): Future[checkSupportResponse] = { val lookupClient = Thrift.newIface[lookupClient[Future]](/*some initializers*/) val req = lookupIPRequest(request.getIps, /*Unimportant variables*/) var resul

这是函数

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)
}
def checkSupport(请求:checkSupportRequest):未来[checkSupportResponse]={
val lookupClient=Thrift.newIface[lookupClient[Future]](/*一些初始值设定项*/)
val req=lookupIPRequest(request.getIps,/*不重要的变量*/)
var result=new checkSupportResponse()
lookupClient.performLookup(req.map{resp=>
//返回IP到国家/地区代码的映射(String:String)
val ip_cc_map=for{

(ip,lxn)我假设通过
Future.value(result)
你实际上是指
Future.successful(result)

闭包内的
result
变量与闭包外的
result
变量不同,因此您从未实际修改在函数开始时声明的
result
变量。因此,它看起来像是您的
Future
从未运行过

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

因此,您可以按如下方式修改函数:

def checkSupport(request: checkSupportRequest): Future[checkSupportResponse] = {
    // declare lookupClient and req as before, but not res

    lookupClient.performLookup(req).map { resp =>
        // do all your processing like before

        val result = new checkSupportResponse()
        result.setOperator_supported(final_result.toList.toMap.mapValues(Boolean.box))

        // We want "result" to be the result of the computation
        result
    }
}

如果您的performLookup函数返回一个
未来
,那么您的
检查支持
函数返回的是
未来[结果]
,而不是
结果
。您的
检查支持
方法定义缺少一个
=
符号,您的
for
理解似乎在不可映射的事物上使用map(
level_2_variable
country_code
)虽然我不能100%确定,因为您的对象定义不完整(缺少类型,
val
def
关键字),看起来更像Java,而不是Scala。请发布一个实际编译的代码版本,这样会更容易帮助您,尽管您的问题可能是@som snytt所说的。@som snytt-我正在单元测试代码中执行一个wait.result()。不过谢谢提醒:)@noziar-我试图尽可能地通用。我已经修改了代码,使其更为明显。我相信事情是兼容的。出于某种原因,我在单元测试中看到的失败是,'checkSupportResponse()'与'checkSupportResponse(受支持:{21.255.255.254=true})不同“啊,这是一个输入错误。闭包中的结果实际上在我的代码中被注释掉了,但在复制它之后,我删除了该注释。我将其更改为Future.successful(),而不是Future.result(),但它找不到successful()作为Future的一名成员…我不知怎的想知道,作为我单元测试的一部分,对内部API的模拟是否可能是问题的一部分…或者代码中是否仍然存在错误?您需要删除
未来。完全成功
,否则您将面临竞争条件。
performLookup
已经返回了未来。然后您将使用
map
创建这个未来,就是这样:代码块中的最后一个表达式将是函数返回的结果。如果添加
Future.successful(…)
在这之后,就好像你完全忽略了前一个,只返回一个可以立即解决的琐碎未来,而不必等待你关心的计算完成。因此,我按照你的建议更改了代码,即如上所述,并删除了Future.value()最后一起调用。这确实可以编译,但最终完全破坏了我的单元测试。失败原因如下,org.specs.runner.UserError:com.company_name.NoBrokersAvailableException:com.company_name.NoStacktrace上没有主机可供客户端使用(未知源)好消息!这可能意味着现在您的未来实际上正在运行:)现在您的Scala问题已经解决,单元测试中的异常是特定于您的代码库的,可能不属于此讨论。我猜您的
performCheck
someLookup
函数中正在发生一些事情,这些函数使运行时不开心。你太棒了。加上单元测试方面的一些修改,我的问题得到了解决。谢谢你的耐心和帮助!