假设我有一个变量x,我想检查它是否等于多个值a,b,c,d,e中的任何一个(我的意思是==相等,而不是同一性)。
在SQL查询中,使用
处理相同的概念WHERE x IN (a, b, c, d, e).
Scala中是否有类似的东西和那样简单?我知道它可以在一行中使用复杂的表达式来构建,例如构建一个HashSet并检查集合中是否存在,但如果它可用,我宁愿使用一个简单的构造。
答案 0 :(得分:24)
您可以按如下方式实施in
运算符:
scala> implicit def anyWithIn[A](a: A) = new {
| def in(as: A*) = as.exists(_ == a)
| }
anyWithIn: [A](a: A)java.lang.Object{def in(as: A*): Boolean}
scala> 5 in (3, 4, 9, 11)
res0: Boolean = false
scala> 5 in (3, 4, 9, 11, 5)
res1: Boolean = true
答案 1 :(得分:22)
我希望contains(a)
超过exists(_ == a)
:
scala> List(3, 4, 5) contains 4
res0: Boolean = true
scala> List(3, 4, 5) contains 6
res1: Boolean = false
更新:contains
在SeqLike
中定义,因此上述内容适用于任何序列。
更新2:以下是SeqLike
中contains
的定义:
def contains(elem: Any): Boolean = exists (_ == elem)
答案 2 :(得分:12)
鉴于Set[A]
也是A => Boolean
,您可以说:
Set(a, b, c, d, e) apply x
为此定义一些pimpin'糖实际上非常好:
class PredicateW[A](self : A => Boolean) {
def ∈:(a : A) = self apply a
}
implicit def pred2wrapper[A](p : A => Boolean) = new PredicateW(p)
然后你可以像这样编写代码:
x ∈: Set(a, b, c, d, e)
答案 3 :(得分:9)
通过综合所有其他答案,我提出了正确的答案:
implicit def anyWithIn[A](a: A) = new {
def ∈(as: A*) = as.contains(a)
}
anyWithIn: [A](a: A)java.lang.Object{def ?(as: A*): Boolean}
5 ∈ (1,3,5)
res1: Boolean = true
的Ta-DA。
答案 4 :(得分:5)
存在:
List (3, 4, 5).exists (_ == 4)
// res20: Boolean = true
查找和过滤结束:
List (3, 4, 5).find (_ == 4)
// res16: Option[Int] = Some(4)
List (3, 4, 5).filter (_ == 4)
// res17: List[Int] = List(4)
我的第一个答案是,作为其他答案,使用包含:
List (3, 4, 5).contains (4)
然后我想,它只适用于像4这样的盒装值,不适用于区分身份和平等的类。为了证明这一点,我写了一个小班,证明 me 错误::)
class Ue (val i: Int) {
override def equals (other: Any) = other match {
case o: Ue => i == o.i
case _ => false }
}
val a = new Ue (4)
// a: Ue = Ue@1e040e5
val b = new Ue (4)
// b: Ue = Ue@1a4548b (no identity)
a == b
// res110: Boolean = true (surprise?)
a.equals (b)
// res112: Boolean = true (expected)
a.eq (b)
// res113: Boolean = false (expected)
List (a).contains (b)
// res119: Boolean = true (surprise)
List (a).exists (_ == b)
// res120: Boolean = true (expected)
List (a).exists (_ .eq (b))
// res121: Boolean = false (expected)
我知道,我必须经常使用equals / eq / ==来区分我的大脑。
List (3, 4, 5).contains (4)
是最简单的答案。
答案 5 :(得分:4)
Set(a, b, c, d, e)(x)
也适用。我会把它作为练习的理由留给读者。 : - )