2016-11-08 57 views
1

如果存在“inStock”键并且列表中的所有值都为true,那么我想返回true。 如果不是,则返回false。如果列表中的所有项都为真,则返回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

考虑接受答案,如果你认为你的问题已经解决。 – maasg

回答

5

你不必转换为布尔类型

product.get("inStock").map(_.forall(_ == "true")).getOrElse(false) 

谨防以下行,如果inStock键可以抛出异常不在地图中。

product("inStock").forall(_ == "true") 

斯卡拉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 

隐忧与NoSuchElementException异常

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(_ && _) 

的理解

使用的事实,期权是一个迭代。

(for { 
    list <- product.get("inStock").iterator 
    elem <- list.iterator 
    result <- Try(elem.toBoolean).toOption.iterator 
    } yield result).reduce(_ && _) 
1

这将返回您要查找的Boolean

product("inStock").forall(_ == "true") 

这将返回一个Failure如果有人拼错的“真”或“假”,或者如果在地图没有“的inStock”键。

Try(product("inStock").map(_.toBoolean).reduce(_ && _)) // Success(false) 
相关问题