6

これは私がよく遭遇するものですが、エレガントな方法がわかりません。Foo オブジェクトのコレクションがあります。Foo には、null または Bar オブジェクトを返すことができるメソッド bar() があります。コレクションをスキャンし、各オブジェクトの bar() メソッドを呼び出して、実際の参照を返す最初のオブジェクトで停止し、スキャンからその参照を返します。

明らかに:

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

トリックを行いますが、 #bar を 2 回呼び出します。

4

2 に答える 2

8

Seq.projectionによって返された Stream[T] で作業するのは良いトリックです

foos.projection map (_.bar) find (_.size > 0)

これにより、検索の実行に必要な値がマップされます。

Scala 2.8 では次のようになります。

foos.view map (_.bar) find (_.size > 0)
于 2010-03-18T13:37:43.213 に答える
7

(これは怠惰に評価されます-2.7で呼び出されます)Iterableを使用して、任意の方法でそれを行うことができます。これを試してみてください:iteratorelements

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)
于 2010-03-18T15:41:41.580 に答える