检查序列[T]是否包含选项[T]

  • 本文关键字:包含 选项 是否 scala
  • 更新时间 :
  • 英文 :


假设我有以下

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

最新更新