我正在学习新的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