【问题标题】:Returning true if all items in a list are true, otherwise false如果列表中的所有项目都为真,则返回真,否则返回假
【发布时间】:2016-11-09 03:34:03
【问题描述】:

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

【问题讨论】:

  • 如果您认为您的问题已得到解决,请考虑接受答案。

标签: scala


【解决方案1】:

你不需要转换为布尔类型

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

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

理解

使用 Option 是可迭代的事实。

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

【讨论】:

    【解决方案2】:

    这将返回您正在寻找的Boolean

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

    如果有人拼错了“true”或“false”,或者地图中没有“inStock”键,这将返回Failure

    Try( product("inStock").map(_.toBoolean).reduce(_ && _) )  // Success(false)
    

    【讨论】:

      猜你喜欢
      • 2021-10-15
      • 2016-05-03
      • 2012-10-12
      • 2017-04-01
      • 2022-11-25
      • 2018-07-29
      • 2019-03-10
      • 1970-01-01
      • 2015-04-27
      相关资源
      最近更新 更多