検索&リターンのための最高のScalaイディオム
-
20-09-2019 - |
質問
これは、私が頻繁に発生したものですが、私はやってのエレガントな方法を知りません。私は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)
所属していません StackOverflow