質問

これは、私が頻繁に発生したものですが、私はやってのエレガントな方法を知りません。私はFooのオブジェクトのコレクションを持っています。 fooがnullまたはバーオブジェクトを返すことがメソッドbar()を持っています。私は、各オブジェクトのバー()メソッドを呼び出して、コレクションをスキャンして、実際の参照を返す最初の1で停止し、スキャンからその参照を返すようにしたいです。

当然ます:

foos.find(_。バー!= null)の.BAR

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

役に立ちましたか?

解決

あなたは( - それは2.7でIterableと呼ばれていますなまけ評価)iteratorを使用して、任意のelementsでそれを行うことができます。これを試してみます:

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)

他のヒント

配列によって返されたストリーム[T]での作業.projection には素敵なトリックです。

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

このは、検索を実行するために必要な値をマップします。

スカラ2.8ではそれがですます:

foos.view map (_.bar) find (_.size > 0)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top