这是我经常遇到的事情,但我不知道优雅的做法。我有一个 Foo 对象的集合。Foo 有一个 bar() 方法,它可以返回 null 或 Bar 对象。我想扫描集合,调用每个对象的 bar() 方法并在第一个返回实际引用时停止并从扫描中返回该引用。
明显地:
foos.find(_.bar != null).bar
做的伎俩,但调用#bar 两次。
这是我经常遇到的事情,但我不知道优雅的做法。我有一个 Foo 对象的集合。Foo 有一个 bar() 方法,它可以返回 null 或 Bar 对象。我想扫描集合,调用每个对象的 bar() 方法并在第一个返回实际引用时停止并从扫描中返回该引用。
明显地:
foos.find(_.bar != null).bar
做的伎俩,但调用#bar 两次。
处理Seq.projection返回的 Stream[T]是一个不错的技巧
foos.projection map (_.bar) find (_.size > 0)
这将映射执行查找所需的值。
在 Scala 2.8 中它是:
foos.view map (_.bar) find (_.size > 0)
您可以使用 any 来执行此Iterable
操作iterator
(懒惰地评估——它elements
在 2.7 中被调用)。试试这个:
case class Foo(i: Int) {
def bar = {
println("Calling bar from Foo("+i+")")
(if ((i%4)==0) "bar says "+i else null)
}
}
val foos = List(Foo(1),Foo(2),Foo(3),Foo(4),Foo(5),Foo(6))
foos.iterator.map(_.bar).find(_!=null)