簡體   English   中英

在 Java 8 中迭代 stream 的最快方法是什么?

[英]What is the fastest way to iterate on a stream in Java 8?

如果我有一個集合並且我想遍歷過濾后的 stream 那么我可以執行以下任一操作(以及更多更遲鈍的選項):

for(item in collection.stream().filter(...).collect(Collectors.toList()))
for(item in collection.stream().filter(...).collect(Collectors.toSet()))

哪個更快? 列表還是集合? 有什么方法可以收集到簡單的 Iterable 或我可以迭代的其他類型嗎?

如果您只想迭代Stream的元素,則無需將其收集到Collection ,只需使用forEach

collection.stream()
          .filter(...)
          .forEach (item -> {
                            // do something with item
                            }
                   );

如果你不關心元素順序使用parallelStream:

collection.parallelStream().filter(...).forEach(...)

這樣,您可以使用更多線程遍歷集合。

為特定案例審查更快地確定哪個流或parallelStream處理更快@Brian Goetz回答相關問題

有沒有辦法收集簡單的Iterable或其他類型我可以迭代?

如果由於某種原因你確實想要使用Stream作為for-each循環的目標,那么你不必收集它:

for (Item item : (Iterable<Item>)
        coll.stream().filter(...)::iterator) {
}

要么:

Iterable<Item> iter = coll.stream().filter(...)::iterator;
for (Item item : iter) {
}

這是有效的,因為Iterable是一個功能界面,即使它沒有注釋。

不過,這只是一個有趣的事情。 forEach如伊蘭已經提出可能是“正確”的方法去一般的東西。 java.util.stream包描述iterator描述為“轉義填充”。

如果性能是您的目標,那么根本不要使用流。 流很好,但它們幾乎總是比普通的舊 java 迭代慢。

什么是最快的取決於情況。 如果純粹為了迭代,那么ArrayList優於HashSet。 迭代 ArrayList 的最快方法不是for-each 循環,而是普通的舊 i 迭代:

int size = list.size();
for (int i = 0; i < size; i++) {
    ...list.get(i)...
}

確保將循環外的大小讀取到局部變量,否則會收到許多對 list.size() 的不必要調用。

如果您需要過濾原始列表,只需在此循環中添加一些 if 幾乎總是比使用帶有過濾器的流更快。

暫無
暫無

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

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