scala - 获取List的只读子列表视图

dav*_*veb 4 iterator scala list

我想要一个List,Seq甚至Iterable是一个List的一部分的只读视图,在我的特定情况下,视图将始终从第一个元素开始.

List.slice,是O(n)原样filter.反正有做比这更好的-我不需要像任何操作+,-等刚apply,map,flatMap,等提供的子名单列表中理解语法.

是编写我自己的类的答案,其迭代器会计算结束的位置?

Wal*_*ang 6

流怎么样?Stream是Scala的懒惰方式.由于Stream的懒惰,Stream.take(),在这种情况下你需要的是O(1).唯一需要注意的是,如果您想在Stream上执行列表解析后返回List,则需要将其转换回List.List.projection为您提供了一个包含List大部分操作的Stream.

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)
Run Code Online (Sandbox Code Playgroud)


mic*_*elg 5

List.slice和List.filter都返回Lists - 根据定义,它们是不可变的.+和 - 方法返回不同的List,它们不会更改原始List.而且,很难比O(N)做得更好.List不是随机访问,而是链表.因此,想象一下,如果您想要的子列表是List的最后一个元素.访问该元素的唯一方法是遍历整个List.