Java 8 流、List.subList 或 Stream.skip().limit()

标签 java java-8 java-stream

我需要对列表的一页进行处理。 所以我想知道以下两者之间哪个更好(在性能和良好实践方面):

public List<Other> function(List<Something> somethingList, 
                            int offset, int pageSize) {
    return somethingList.stream().skip(offset * pageSize).limit(pageSize)
        .map(s -> doSomething(s)).collect(Collectors.toList());
}

或:

public List<Other> function(List<Something> somethingList, 
                            int offset, int pageSize) {
    return somethingList.subList(offset * pageSize, offset * pageSize + pageSize)
        .stream().map(s -> doSomething).collect(Collectors.toList());
}

我自愿省略了偏移量和页面大小的验证。

编辑:这不是性能的重要需求,我的问题还在于清晰度、维护和良好实践。我更喜欢流的方式,特别是因为它需要较少的验证。但我更愿意确保这不是真正的性能损失或不太可维护/干净的东西。

最佳答案

区别在于流操作的排序方式。 Java Stream API 。跳过的国家很便宜。

While skip() is generally a cheap operation on sequential stream pipelines, it can be quite expensive on ordered parallel pipelines, especially for large values of n, since skip(n) is constrained to skip not just any n elements, but the first n elements in the encounter order. Using an unordered stream source (such as generate(Supplier)) or removing the ordering constraint with BaseStream.unordered() may result in significant speedups of skip() in parallel pipelines, if the semantics of your situation permit. If consistency with encounter order is required, and you are experiencing poor performance or memory utilization with skip() in parallel pipelines, switching to sequential execution with BaseStream.sequential() may improve performance.

Limit: Returns a stream consisting of the elements of this stream, additionally performing the provided action on each element as elements are consumed from the resulting stream.

在子列表上使用流的一个好处是您可以应用过滤器和/或您询问的逻辑,并且它可能比创建子列表更便宜。虽然流按函数顺序发生,但某些元素可能会被过滤掉,您只需执行流一次。在列出项目时,您可能需要多次循环并使用多个对象来临时保存项目;通常会循环遍历该项目的相同不需要的函数。

虽然你的问题非常具体。这些相同的原则也适用于列表中幕后发生的事情。 Power of streams 。在底层,您仍然可能拥有来自流的多个对象;但是当程序员对元素集合进行复杂操作时,复杂性就被消除了。简单地说,它可以取代我们使用顶级流程元素的许多背靠背 for 循环。它们确实很实用。 Streams can replace for loops .

关于Java 8 流、List.subList 或 Stream.skip().limit(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55358593/

相关文章:

java - 简化与数组的比较

java - 如何使addActionListener和add工作?

java-8 - 带有 lambda 参数的 kotlin 日志记录

java - 遍历集合,对每个项目执行操作并作为列表返回

java - 如何从包含数组的数组中删除空值

java - 当GC可以释放所有连接时,为什么需要finalize

java - 根据另一个列表的顺序对列表进行排序

java - 将返回 boolean 值的嵌套 for 循环转换为 java 8 流?

java - 展平 map 中的列表列表

java - 如何使用线程尽可能快地读取 zip 流?