我有一个java.lang.Iterable
,它懒惰地计算其值。我正在从Scala访问它。有没有仅返回不同值的核心API方法?例如,成像有一个过滤器方法,该方法还提供了到目前为止返回的所有结果:
val myLazyDistinctIterable = iterable.filter((previousReturnedItems, newItem) => previousReturnedItems.contains(newItem))
我猜这不是一个很普通的情况,因为它涉及存储先前返回的项目,这可能就是为什么它不在核心API中的原因。
我知道
List.distinct
和Set
,但是我想要一些在询问之前不会计算其元素的东西。 最佳答案
您可以在 distinct
上使用Stream
方法。例如,如果您有此Iterable
:
val it = new java.lang.Iterable[Int] {
def iterator = new java.util.Iterator[Int] {
var i = 0
var first = true
def hasNext = true
def next =
if (first) { first = false; i } else { first = true; i += 1; i - 1 }
def remove() { throw new UnsupportedOperationException("Can't remove.") }
}
}
你可以写:
scala> import scala.collection.JavaConverters._
import scala.collection.JavaConverters._
scala> val s = it.asScala.toStream
s: scala.collection.immutable.Stream[Int] = Stream(0, ?)
scala> s.take(10).toList
res0: List[Int] = List(0, 0, 1, 1, 2, 2, 3, 3, 4, 4)
scala> val s = it.asScala.toStream.distinct
s: scala.collection.immutable.Stream[Int] = Stream(0, ?)
scala> s.take(10).toList
res1: List[Int] = List(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
我们可以说,由于流是无限的,所以一切都是适当的惰性。