find&;的最佳scala习惯用法;返回
这是我经常遇到的事情,但我不知道优雅的做法。我有一个Foo对象的集合。Foo有一个方法bar(),该方法可能返回null或bar对象。我想扫描集合,调用每个对象的bar()方法,并在第一个返回实际引用的集合上停止,然后从扫描中返回该引用 显然: foos.find(u.bar!=null).barfind&;的最佳scala习惯用法;返回,scala,scala-collections,Scala,Scala Collections,这是我经常遇到的事情,但我不知道优雅的做法。我有一个Foo对象的集合。Foo有一个方法bar(),该方法可能返回null或bar对象。我想扫描集合,调用每个对象的bar()方法,并在第一个返回实际引用的集合上停止,然后从扫描中返回该引用 显然: foos.find(u.bar!=null).bar 执行此技巧,但调用#bar两次。处理返回的流[T]是一个很好的技巧 foos.projection map (_.bar) find (_.size > 0) 这将映射执行find所需的值 在
执行此技巧,但调用#bar两次。处理返回的流[T]是一个很好的技巧
foos.projection map (_.bar) find (_.size > 0)
这将映射执行find所需的值
在Scala 2.8中,它是:
foos.view map (_.bar) find (_.size > 0)
您可以使用任何
Iterable
,通过使用iterator
(它的计算是惰性的——在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]的记忆是区别
val-mapped=foos.elements.map(uu.bar);mapped.find(!=null);mapped.find(!=null)
返回Some(比如4条)
和None
其中val-mapped=foos.projection.map(code.bar);mapped.find(!=null);mapped.find(!=null)
返回两次Some(比如4条)
foos。Scala 2.8中的view
返回与foos相同的值。projection
但对元素求值两次(不进行记忆)。如果您想多次使用结果(或一些仅在projections上可用的小方法集),请使用projections;否则,迭代器更便宜,因为它们不需要保存状态。