最好的scala成语,用于查找和返回

Itt*_*ayD 6 scala scala-collections

这是我经常遇到的事情,但我不知道这种优雅的做法.我有一个Foo对象的集合.Foo有一个方法bar()可以返回null或Bar对象.我想扫描集合,调用每个对象的bar()方法,并在第一个返回实际引用时停止并从扫描返回该引用.

明显:

foos.find(_.bar!= null).bar

诀窍,但两次调用#bar.

Tho*_*ung 8

处理由Seq.projection返回的Stream [T] 是一个很好的技巧

foos.projection map (_.bar) find (_.size > 0)
Run Code Online (Sandbox Code Playgroud)

这将映射执行find所需的值.

在Scala 2.8中它是:

foos.view map (_.bar) find (_.size > 0)
Run Code Online (Sandbox Code Playgroud)


Rex*_*err 7

你可以使用任何一个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)
Run Code Online (Sandbox Code Playgroud)