假设我有A
方法的foo
类:
class A(x: Int) { def foo(): Option[Int] = if (x > 0) Some(x) else None }
现在我正在编写函数bar
,如下所示:
def bar(as: List[A]): Option[(A, Int)] = for {
a <- as.view.find(_.foo.nonEmpty)
foo <- a.foo
} yield (a, foo)
上面的代码工作正常,但它为找到的foo
实例两次调用A
方法。如何重新编写bar
只为找到的foo
实例调用方法A
一次?
as.iterator.flatMap { a => a.foo.map { a -> _ } }.find(_ => true)
使用流。流中的元素被懒惰地评估。
def bar(as: List[A]): Option[(A, Int)] = {
as
.toStream
.map(x => (x, x.foo()))
.find(z => z._2.isDefined)
.map(p => (p._1, p._2.get))
}