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

时间:2020-04-04 21:52:56

标签: scala

假设我有以下内容

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

我想检查a中是否存在类型Option[Int]的{​​{1}}

这不起作用

Seq[Int]

由于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 } 或任何其他有趣的方法

2 个答案:

答案 0 :(得分:6)

要检查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))

答案 1 :(得分:1)

您也可以使用这种方法:

bar.collect {
  case Foo(Some(v)) => v
}.intersect(baz).nonEmpty

收集Foo中存在的所有元素,然后与baz集合进行交集。如果true集合中存在bar集合中的元素,则结果为baz