假设我有以下内容
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
}
或任何其他有趣的方法
答案 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
。