我有一个java.lang.Iterable,它懒惰地计算其值。我正在从Scala访问它。有没有仅返回不同值的核心API方法?例如,成像有一个过滤器方法,该方法还提供了到目前为止返回的所有结果:

val myLazyDistinctIterable = iterable.filter((previousReturnedItems, newItem) => previousReturnedItems.contains(newItem))

我猜这不是一个很普通的情况,因为它涉及存储先前返回的项目,这可能就是为什么它不在核心API中的原因。

我知道List.distinctSet,但是我想要一些在询问之前不会计算其元素的东西。

最佳答案

您可以在 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)

我们可以说,由于流是无限的,所以一切都是适当的惰性。

10-07 15:29