假设我有以下内容
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或任何其他有趣的方法
要检查 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)
| 归档时间: |
|
| 查看次数: |
68 次 |
| 最近记录: |