如何简化布尔元素的foldLeft操作?

时间:2014-06-04 05:54:06

标签: scala scala-2.10

我使用此方法来确定字符串是否全部为大写。

def isAllUpperCase(s: String): Boolean = 
  s.foldLeft(true)((res, ch) => res && ch.isUpper)

IntelliJ警告可以简化对集合的此操作。可悲的是,我是斯卡拉诺布。有什么想法吗?

2 个答案:

答案 0 :(得分:5)

foldLeft开始,请考虑给定字符串s

(true /: s)(_ && _.isUpper)

或等效,

s.foldLeft(true)(_ && _.isUpper)

对于此特定问题,请同时考虑forall,如下所示

"abc".forall(_.isUpper)
res: Boolean = false

"Abc".forall(_.isUpper)
res: Boolean = false

"ABC".forall(_.isUpper)
res: Boolean = true

即,只有当每个被检查的元素的计算结果为真时,它才会计算为真。

然后,

implicit class RichUppercase(val s: String) extends AnyVal {
  def allUpper() = s.forall(_.isUpper)
}

等等

"abc".allUpper
res: Boolean = false

"ABC".allUpper
res: Boolean = true

<强>更新

另一种方法依赖于找到原始字符串与大写字符串之间的差异,如此,

val a = "Abc"
a: String = abc

a diff a.toUpperCase
res: String = bc

a.toUpperCase diff a.toUpperCase
res: String = ""

因此产生的空字符串表示字符串中的所有字符都是大写的。

答案 1 :(得分:1)

您想要forall

def isAllUpperCase(s: String): Boolean = s.forall(_.isUpper)