我想要一个 List
、 Seq
,甚至是一个 List 一部分的只读 View 的 Iterable
,在我的特定情况下, View 将始终从第一个元素开始。List.slice
和 filter
都是 O(n)。有没有比这更好的 - 我不需要任何操作,如 +
、 -
等。只需 apply
、 map
、 flatMap
等来提供子列表上的列表理解语法。
答案是写我自己的类,它的迭代器会计数以知道终点在哪里?
最佳答案
流呢? Stream 是 Scala 的懒惰方式。由于 Stream 的惰性,Stream.take(),在这种情况下您需要的是 O(1)。唯一需要注意的是,如果您想在对 Stream 进行列表理解后取回 List,则需要将其转换回 List。 List.projection 为您提供一个 Stream,它具有 List 的大部分操作。
scala> val l = List(1, 2, 3, 4, 5)
l: List[Int] = List(1, 2, 3, 4, 5)
scala> val s = l.projection.take(3)
s: Stream[Int] = Stream(1, ?)
scala> s.map(_ * 2).toList
res0: List[Int] = List(2, 4, 6)
scala> (for (i <- s) yield i * 2).toList
res1: List[Int] = List(2, 4, 6)
关于list - scala - 获取列表的只读子 ListView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1485185/