Scala 试图返回映射,但当前正在返回一个Iterable
为什么我的valScala 试图返回映射,但当前正在返回一个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
pairOpt
aOption[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]的方法