我正在學習新的Java 8功能,並在嘗試使用流(java.util.stream.Stream)和收集器時,我意識到一個流不能使用兩次..有什麼方法可以重用它嗎?有沒有什麼方法可以重用java 8中的Stream?
24
A
回答
32
甲流應在(調用的中間或末端流操作)只有一次操作。
如果流實現檢測到流正在被重用,則可能會拋出IllegalStateException。
所以答案是否定的,流不意味着被重用。
1
流的整個想法是它是一次性的。這使您可以創建不可重新獲取的來源(例如,從網絡連接讀取線路)而無需中間存儲。如果,但是,要重用流的內容,你可以轉儲到中間收集獲得「硬拷貝」:
Stream<MyType> stream = // get the stream from somewhere
List<MyType> list = stream.collect(Collectors.toList()); // materialize the stream contents
list.stream().doSomething // create a new stream from the list
list.stream().doSomethingElse // create one more stream from the list
23
如果您想要重新使用流的效果,可以將流表達式包裝到供應商中,並在需要時重新調用myStreamSupplier.get()。例如,
Supplier<Stream<String>> sup =() ->
someList.stream();
List<String> nonEmptyStrings = sup.get().filter(s -> !s.isEmpty()).collect(Collectors.toList());
Set<String> uniqueStrings = sup.get().collect(Collectors.toSet());
9
正如其他人所說,「不,你不能」。
但要記住很多基本操作方便summaryStatistics()
這是有用的:
所以不是:
List<Person> personList = getPersons();
personList.stream().mapToInt(p -> p.getAge()).average().getAsDouble();
personList.stream().mapToInt(p -> p.getAge()).min().getAsInt();
personList.stream().mapToInt(p -> p.getAge()).max().getAsInt();
您可以:
// Can also be DoubleSummaryStatistics from mapToDouble()
IntSummaryStatistics stats = personList.stream()
.mapToInt(p-> p.getAge())
.summaryStatistics();
stats.getAverage();
stats.getMin();
stats.getMax();
相關問題
- 1. 有沒有什麼方法可以使用'unset'作爲方法?
- 2. Java 8 Stream主要方法
- 3. Stream API中爲什麼沒有flatten()方法?
- 4. 有沒有什麼辦法重用java中的arraylist?
- 5. 有沒有什麼方法可以將秒轉換爲Java 8中的LocalDateTime或ZonedDateTime對象
- 6. 有沒有什麼方法可以在html中查看文件?
- 7. 爲什麼在Java Stream接口中重載()的varargs方法?
- 8. Java 8 Stream - 爲什麼filter方法不能執行?
- 9. 有什麼方法可以計算java中的指令數
- 10. 有沒有什麼方法可以替代iframe?
- 11. 有沒有什麼方法可以自定義card.io SDK?
- 12. 有沒有什麼方法可以去除這種水印?
- 13. 有沒有什麼方法可以定義javascript模式
- 14. 有沒有什麼方法可以縮短這個代碼呢?
- 15. 爲什麼Java 8沒有「myArray.stream()」函數?
- 16. 有沒有一種客戶端可以看到$ _SESSION中有什麼的方法?
- 17. 爲什麼沒有沒有參數的IsNullOrEmpty重載方法?
- 18. 爲什麼沒有Stream.flatMap(Collection)方法?
- 19. 爲什麼Enumerable中的方法可能沒有方法體?
- 20. 有什麼方法可以在Windows Media Control中重放視頻?
- 21. 有沒有什麼簡單的方法可以用CakePHP使用Hoptoad?
- 22. 有沒有什麼方法可以在Java應用程序中使用HTML和CSS用於我的UI?
- 23. 有什麼方法可以管理onPanResponderMove?
- 24. 有什麼方法可以跟蹤PDF?
- 25. 有什麼方法可以定製TDBadgedCell
- 26. 爲什麼Swift中的方法可以有沒有類型的參數?
- 27. 有沒有什麼方法可以訪問Android的WebView中的DOM結構?
- 28. Java 8 Stream,anyMatch
- 29. 有沒有其他方法可以在java中重複打印字符?
- 30. 是否有更高效的Java 8 Stream方法來查找int []中的索引?
是,流可以被重複使用,只有當任何用途都不會在其上調用任何終端操作。 –
[Copy a stream to avoid「stream has been been been upon upon or closed」(java 8)](http://stackoverflow.com/questions/23860533/copy-a-stream-to-avoid-stream- has-been-been-operated-upon-or-closed-java-8) – Andrejs