簡體   English   中英

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

[英]Java 8 stream, List.subList or Stream.skip().limit()

我需要在列表的頁面上進行處理。 因此,我想知道以下兩者之間在性能和良好實踐方面哪個更好:

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 跳過的國家很便宜。

盡管skip()在順序流管道上通常是便宜的操作,但在有序並行管道上可能會非常昂貴,尤其是對於較大的n值,因為skip(n)不僅被限制為不僅跳過任何n個元素,而且還跳過第一個n遇到順序中的元素。 如果情況的語義允許,則使用無序流源(例如generate(Supplier))或使用BaseStream.unordered()刪除排序約束可能會導致並行管道中skip()的顯着加速。 如果需要與遇到順序保持一致,並且在並行管道中使用skip()遇到性能低下或內存使用不足的情況,則切換為使用BaseStream.sequential()順序執行可能會提高性能。

限制:返回由該流的元素組成的流,並在從結果流中消耗元素時對每個元素另外執行提供的操作。

在子列表上使用流的一個好處是,您可以應用過濾器和/或您詢問的邏輯,與創建子列表相比,這樣做可能會更便宜。 盡管流按功能順序發生,但某些元素可能會被過濾掉,而您只需要執行一次流。 在列出項目時,您可能不得不循環多次並使用多個對象臨時保留這些項目; 通常會遍歷該項目相同的不需要功能。

雖然您的問題很具體。 這些相同的原則將適用於列表中的實際情況。 流的力量 在引擎蓋下,流中可能仍然有多個對象。 但是當對一組元素執行復雜的操作時,復雜性就從程序員那里移走了。 簡而言之,它可以替代許多背靠背的循環,而在循環中我們使用頂級過程元素。 它們確實是實用程序。 流可以代替循環

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM