假设我有以下
case class Foo(a: Option[Int])
val bar = Seq(Foo(Some(0)), Foo(Some(1)), Foo(None))
val baz = Seq(0, 2)
并且我想检查Seq[Int]
中是否存在Option[Int]
类型的a
不起作用
bar.map {
case foo: Foo if !baz.contains(foo.a) => Foo(None)
case foo: Foo => foo
}
由于a
属于Option[Int]
类型,因此contains(foo.a)
总是返回false
我知道我可以做以下任何一种
bar.map {
case foo: Foo if foo.a.isEmpty || !baz.contains(foo.a.get) => Foo(None)
case foo: Foo => foo
}
bar.map {
case Foo(None) => Foo(None)
case Foo(Some(a)) if !baz.contains(a) => Foo(None)
case foo: Foo => foo
}
但我想知道是否还有其他方法,基本上是containsOption
或任何其他有趣的方法
要检查Option
中是否存在包含在List
中的值,我们可以编写
Some(2).exists(baz.contains) // true
Some(1).exists(baz.contains) // false
Option.empty[Int].exists(baz.contains) // false
因此,如果你试图在这样的谓词上过滤bar
,那么
bar.filter(_.a.exists(baz.contains))
// List(Foo(Some(0)))
同时尝试直接回答问题
bar.map(foo => if (foo.a.exists(baz.contains)) foo else Foo(None))
// List(Foo(Some(0)), Foo(None), Foo(None))
您也可以使用这种方法:
bar.collect {
case Foo(Some(v)) => v
}.intersect(baz).nonEmpty
收集Foo
中存在的所有元素,然后与baz
集合进行交集。如果bar
集合中存在baz
集合中存在的元素,则结果为true
。