如果存在“inStock”键并且列表中的所有值都为真,我想返回true。 如果没有,则返回false。
val product = Map("ids" -> List("1" ,"2", "3"), "inStock" -> List("true", "false", "true", "true"))
product.get("inStock").map(x => x.forall(true)) // doesnt' work currently
<console>:13: error: type mismatch;
found : Boolean(true)
required: String => Boolean
我还应该安全地将字符串值解析为类似的布尔值:
Try(x.toBoolean)
答案 0 :(得分:6)
您无需转换为布尔类型
product.get("inStock").map(_.forall(_ == "true")).getOrElse(false)
如果地图中没有inStock
密钥,请注意以下行可能会抛出异常。
product("inStock").forall(_ == "true")
Scala REPL
scala> val product = Map("ids" -> List("1" ,"2", "3"), "inStock" -> List("true", "false", "true", "true"))
product: Map[String, List[String]] = Map("ids" -> List("1", "2", "3"), "inStock" -> List("true", "false", "true", "true"))
scala> import scala.util._
import scala.util._
scala> product.get("inStock").map(_.forall(_ == "true")).getOrElse(false)
res7: Boolean = false
scala> product.get("foo").map(_.forall(_ == "true")).getOrElse(false)
res8: Boolean = false
scala> product("foo").forall(_ == "true")
java.util.NoSuchElementException: key not found: foo
scala.collection.MapLike$class.default(MapLike.scala:228)
scala.collection.AbstractMap.default(Map.scala:59)
scala.collection.MapLike$class.apply(MapLike.scala:141)
scala.collection.AbstractMap.apply(Map.scala:59)
$sess.cmd9$.<init>(cmd9.sc:1)
$sess.cmd9$.<clinit>(cmd9.sc:-1)
scala> product.get("foo").map(_.forall(_ == "true")).getOrElse(false)
res7: Boolean = false
product.get("inStock")
.toSeq.flatten.map(elem => Try(elem.toBoolean))
.collect { case Success(value) => value}
.reduce(_ && _)
使用Option是可迭代的事实。
(for {
list <- product.get("inStock").iterator
elem <- list.iterator
result <- Try(elem.toBoolean).toOption.iterator
} yield result).reduce(_ && _)
答案 1 :(得分:1)
这将返回您正在寻找的Boolean
。
product("inStock").forall(_ == "true")
如果某人拼写错误“true”或“false”,或者地图中没有“inStock”键,则会返回Failure
。
Try( product("inStock").map(_.toBoolean).reduce(_ && _) ) // Success(false)