[英]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.