我正在學習新的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. 有沒有什麼方法可以在Harp.js中使用Jade塊?
- 4. 使用帶有ObjectMapper的Java 8 Stream readValue方法
- 5. Stream API中爲什麼沒有flatten()方法?
- 6. 有沒有什麼方法可以在html中查看文件?
- 7. 有沒有什麼方法可以在Windows中模擬LD_LIBRARY_PATH?
- 8. 有沒有什麼方法可以在JavaScript中凍結document.body.innerHTML?
- 9. 爲什麼在Java Stream接口中重載()的varargs方法?
- 10. 有沒有什麼辦法重用java中的arraylist?
- 11. 有沒有什麼方法可以將秒轉換爲Java 8中的LocalDateTime或ZonedDateTime對象
- 12. Java 8 Stream - 爲什麼filter方法不能執行?
- 13. 有沒有什麼可以嚴格的在Laravel的方法?
- 14. 有沒有什麼方法可以在WSO2中存儲和重發消息
- 15. 有沒有什麼方法可以查詢bean的spring容器
- 16. 有沒有什麼辦法可以讓這個java更小?
- 17. 有什麼方法可以使用Graph API從Facebook Ticker(App或Stream)讀取?
- 18. 有沒有什麼辦法可以使用八度音程,就像java中的
- 19. 有什麼方法可以計算java中的指令數
- 20. 有沒有什麼辦法可以在非Activity類中使用openFileOutput()方法?
- 21. 爲什麼Java 8 Stream類AutoCloseable?
- 22. 有沒有什麼方法可以替代iframe?
- 23. 有沒有什麼辦法可以得到java中的類中調用方法的列表?
- 24. 有沒有什麼方法可以去除這種水印?
- 25. 有沒有什麼方法可以定義javascript模式
- 26. 有沒有什麼方法可以縮短這個代碼呢?
- 27. 有沒有什麼方法可以用MATLAB以外的黑色填充圖像?
- 28. 爲什麼Java 8沒有「myArray.stream()」函數?
- 29. 有沒有一種客戶端可以看到$ _SESSION中有什麼的方法?
- 30. 有沒有什麼辦法可以在函數中使用get_sidebar?
是,流可以被重複使用,只有當任何用途都不會在其上調用任何終端操作。 –
[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