Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
find&;的最佳scala习惯用法;返回_Scala_Scala Collections - Fatal编程技术网

find&;的最佳scala习惯用法;返回

find&;的最佳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所需的值 在

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

显然:

foos.find(u.bar!=null).bar


执行此技巧,但调用#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;否则,迭代器更便宜,因为它们不需要保存状态。