检查 Seq[T] 是否包含 Option[T]

Cer*_*vEd 0 scala

假设我有以下内容

case class Foo(a: Option[Int])
val bar = Seq(Foo(Some(0)), Foo(Some(1)), Foo(None))
val baz = Seq(0, 2)
Run Code Online (Sandbox Code Playgroud)

我想检查a类型是否Option[Int]存在于Seq[Int]

这不起作用

bar.map {
  case foo: Foo if !baz.contains(foo.a) => Foo(None)
  case foo: Foo => foo  
}
Run Code Online (Sandbox Code Playgroud)

因为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
}
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有另一种方式,基本上是一种containsOption或任何其他有趣的方法

Mar*_*lic 6

要检查 a 中是否存在Option包含在 a 中的值,List我们可以编写

Some(2).exists(baz.contains)           // true
Some(1).exists(baz.contains)           // false
Option.empty[Int].exists(baz.contains) // false
Run Code Online (Sandbox Code Playgroud)

因此,如果您尝试过滤bar此类谓词,则

bar.filter(_.a.exists(baz.contains))
// List(Foo(Some(0)))
Run Code Online (Sandbox Code Playgroud)

在尝试直接回答问题的同时

bar.map(foo => if (foo.a.exists(baz.contains)) foo else Foo(None))
// List(Foo(Some(0)), Foo(None), Foo(None))
Run Code Online (Sandbox Code Playgroud)