最好的scala成语for find&返回

时间:2010-03-18 13:20:53

标签: scala scala-collections

这是我经常遇到的事情,但我不知道这种优雅的做法。我有一个Foo对象的集合。 Foo有一个方法bar()可以返回null或Bar对象。我想扫描集合,调用每个对象的bar()方法,并在第一个返回实际引用时停止并从扫描返回该引用。

显然:

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

可以解决问题,但会两次调用#bar。

2 个答案:

答案 0 :(得分:8)

使用Seq.projection返回的Stream [T]是一个很好的技巧

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

这将映射执行find所需的值。

在Scala 2.8中,它是:

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

答案 1 :(得分:7)

您可以使用Iterable(任何iterator(懒惰地评估 - 在2.7中称为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) 。试试这个:

{{1}}