Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.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 试图返回映射,但当前正在返回一个Iterable_Scala - Fatal编程技术网

Scala 试图返回映射,但当前正在返回一个Iterable

Scala 试图返回映射,但当前正在返回一个Iterable,scala,Scala,为什么我的valpairOptaOption[Option[String,String]] 我试图让它返回选项[(字符串,字符串)] def blah(..):映射[字符串,字符串]={ val映射:映射[字符串,字符串]=// val boolTry=Try(map.getOrElse(“key1”),trim.toBoolean) val intTry=Try(map.getOrElse(“key2,”).trim.toInt) val pairOpt:选项[选项[(字符串,字符串)]]=f

为什么我的val
pairOpt
a
Option[Option[String,String]]

我试图让它返回
选项[(字符串,字符串)]

def blah(..):映射[字符串,字符串]={
val映射:映射[字符串,字符串]=//
val boolTry=Try(map.getOrElse(“key1”),trim.toBoolean)
val intTry=Try(map.getOrElse(“key2,”).trim.toInt)
val pairOpt:选项[选项[(字符串,字符串)]]=for{
b部分(“b”)
案例(对,5 | 9 | 11)=>一些(“c”)
案例=>无
}
res.map(“foo”->)
}
map++pairOpt//map+(“foo”->“c”)
}
当我希望返回值是
Map[String,String]
时,返回值当前也是
Iterable[Product with Serializable]

def blah(..): Map[String, String] = {

  val map: Map[String, String] = //
  val boolTry = Try(map.getOrElse("key1", "").trim.toBoolean)
  val intTry = Try(map.getOrElse("key2, "").trim.toInt)

  val pairOpt: Option[Option[(String, String)]] = for {
    b <- boolTry.toOption
    i <- intTry.toOption
  } yield {
    val res: Option[String] = (b, i) match {
      case (true, 1) => Some("a")
      case (false, 2 | 3 | 7) => Some("b")
      case (true, 5 | 9 | 11) => Some("c")
      case _ => None
    }
    res.map("foo" -> _)
  }

  map ++ pairOpt // map + ("foo" -> "c")

}

我在这里遗漏了什么?

你得到了一个
选项[Option[…]]
,因为这里有两个“可选性”的“层”,你必须展平

  • 如果
    boolTry
    intTry
    中的一个出现
    故障
    -您将得到
  • 否则,如果它们都是
    Success
    ,但它们的值不匹配,您将得到
    Some(None)
  • 否则,您将得到
    Some(Some(…)
更一般地说,给定一个
opt:Option[V]
,表达式的类型为:

for {
   x <- opt
   .. 
} yield {
   val y: T
   y
}
这也将解决方法返回类型的问题(现在
map++pairOpt
的类型将如预期的那样
map[String,String]

为了避免调用
展平
——实现这一点的更简洁的方法可能是:

val maybeTuple: Option[(Boolean, Int)] = boolTry.flatMap(b => intTry.map((b, _))).toOption

val pairOpt: Option[(String, String)] = maybeTuple.flatMap {
  case (true, 1) => Some("a")
  case (false, 2 | 3 | 7) => Some("b")
  case (true, 5 | 9 | 11) => Some("c")
  case _ => None
}.map("foo" -> _)

您将获得一个
选项[Option[…]]
,因为这里有两层“可选性”,您必须展平

  • 如果
    boolTry
    intTry
    中的一个出现
    故障
    -您将得到
  • 否则,如果它们都是
    Success
    ,但它们的值不匹配,您将得到
    Some(None)
  • 否则,您将得到
    Some(Some(…)
更一般地说,给定一个
opt:Option[V]
,表达式的类型为:

for {
   x <- opt
   .. 
} yield {
   val y: T
   y
}
这也将解决方法返回类型的问题(现在
map++pairOpt
的类型将如预期的那样
map[String,String]

为了避免调用
展平
——实现这一点的更简洁的方法可能是:

val maybeTuple: Option[(Boolean, Int)] = boolTry.flatMap(b => intTry.map((b, _))).toOption

val pairOpt: Option[(String, String)] = maybeTuple.flatMap {
  case (true, 1) => Some("a")
  case (false, 2 | 3 | 7) => Some("b")
  case (true, 5 | 9 | 11) => Some("c")
  case _ => None
}.map("foo" -> _)

您可以选择返回Map[String,String]或Option[(String,String)]?我认为,iterable是返回的,因为它是唯一满足将Map[String,String]添加到Option[Option[String,String]]的可能类型。@pedrofurla我想让comp返回选项[String,String]和返回Map[String,String]的方法将其返回Map[String,String]或Option[(String,String)]?我认为返回iterable是因为它是唯一满足将Map[String,String]添加到Option[Option[String,String]]的可能类型。@pedrofurla我想让comp返回选项[String,String]和返回Map[String,String]的方法