лучшая scala идиома для находки и возврата

Это - что-то, с чем я часто встречаюсь, но я не знаю изящный способ сделать. У меня есть набор объектов Foo. У Foo есть панель метода (), который может возвратить пустой указатель или объект Панели. Я хочу просканировать набор, называя панель каждого объекта () методом и остановкой на первой, возвращая фактическую ссылку и возврат что ссылка от сканирования.

Очевидно:

foos.find (_ .bar! = пустой указатель) .bar

добивается цели, но называет #bar дважды.

6
задан Eugene Yokota 15 December 2010 в 20:43
поделиться

2 ответа

Вы можете сделать это с любым 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)
7
ответ дан 8 December 2019 в 16:01
поделиться

Работа с потоком [T], возвращенным Seq.projection - отличный трюк

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

. Он отображает значения, необходимые для выполнения find.

В Scala 2.8 это:

foos.view map (_.bar) find (_.size > 0)
8
ответ дан 8 December 2019 в 16:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: