Это - что-то, с чем я часто встречаюсь, но я не знаю изящный способ сделать. У меня есть набор объектов Foo. У Foo есть панель метода (), который может возвратить пустой указатель или объект Панели. Я хочу просканировать набор, называя панель каждого объекта () методом и остановкой на первой, возвращая фактическую ссылку и возврат что ссылка от сканирования.
Очевидно:
foos.find (_ .bar! = пустой указатель) .bar
добивается цели, но называет #bar дважды.
Вы можете сделать это с любым Iterable
, используя итератор
(который выполняет ленивое вычисление - он называется 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)
Работа с потоком [T], возвращенным Seq.projection - отличный трюк
foos.projection map (_.bar) find (_.size > 0)
. Он отображает значения, необходимые для выполнения find.
В Scala 2.8 это:
foos.view map (_.bar) find (_.size > 0)