Tôi đang học các tính năng Java 8 mới, và trong khi thử nghiệm với các luồng (java.util.stream.Stream) và các bộ thu, tôi nhận ra rằng một luồng không thể được sử dụng hai lần .. có cách nào để sử dụng lại nó không?Có cách nào để tái sử dụng Luồng trong java 8 không?
Trả lời
Từ documentation:
Một dòng nên được phẫu thuật (cách gọi một hoạt động dòng trung gian hoặc thiết bị đầu cuối) chỉ một lần.
Việc triển khai luồng có thể ném IllegalStateException nếu phát hiện thấy luồng đang được sử dụng lại.
Vì vậy, câu trả lời là không, luồng không được sử dụng lại.
Toàn bộ ý tưởng của Luồng là nó một lần. Điều này cho phép bạn tạo các nguồn không thể tái nhập (ví dụ, đọc các dòng từ kết nối mạng) mà không cần lưu trữ trung gian. Tuy nhiên, nếu bạn muốn sử dụng lại nội dung Luồng, bạn có thể đưa nội dung đó vào bộ sưu tập trung gian để lấy "bản in ra giấy":
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
Nếu bạn không muốn thực hiện luồng, trong một số trường hợp là cách để thực hiện một số việc với cùng một luồng cùng một lúc. Ví dụ: bạn có thể tham khảo câu hỏi this hoặc this để biết chi tiết.
Nếu bạn muốn có tác dụng sử dụng lại luồng, bạn có thể bao bọc biểu thức luồng trong Nhà cung cấp và gọi myStreamSupplier.get() bất cứ khi nào bạn muốn một hình mới. Ví dụ:
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());
Như những người khác đã nói "không, bạn không thể".
Nhưng nó là hữu ích để nhớ tiện dụng summaryStatistics()
cho nhiều thao tác cơ bản:
Vì vậy, thay vì:
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();
Bạn có thể:
// Can also be DoubleSummaryStatistics from mapToDouble()
IntSummaryStatistics stats = personList.stream()
.mapToInt(p-> p.getAge())
.summaryStatistics();
stats.getAverage();
stats.getMin();
stats.getMax();
- 1. Tái sử dụng luồng trong Java 8
- 2. Chuyển đổi bằng cách sử dụng JAVA 8 Luồng
- 3. Java 8 Luồng để thao tác chuỗi
- 4. Làm thế nào để có được một loạt các mục từ luồng bằng cách sử dụng Java 8 lambda?
- 5. Làm cách nào để tái sử dụng một chuỗi trong Java?
- 6. Các luồng Java 8 không có ý định sử dụng với các ký tự và chuỗi?
- 7. API Java 8 luồng trong Android N
- 8. Các luồng trong Java 8: giải pháp đơn giản để sử dụng parallelstream() trên một cụm?
- 9. Java 8 Stream đa luồng
- 10. Cách tìm đúng các đặc tính luồng trong Java-8?
- 11. Cách tạo mảng hai chiều từ luồng trong Java 8?
- 12. Làm thế nào để tái sử dụng một ứng dụng tái sử dụng trong Django
- 13. Sử dụng API Java 8 luồng, có thể sắp xếp() được dựa vào khi gọi Collectors.toSet()?
- 14. Làm cách nào để kết hợp giữa hai luồng trên luồng có cấu trúc Spark? - Java 8
- 15. Java 8 Luồng: IntStream thành Chuỗi
- 16. Có cách nào để sử dụng errno an toàn trong ứng dụng đa luồng không?
- 17. Sắp xếp bằng cách sử dụng Giao diện so sánh và java 8 luồng
- 18. Có thể làm một nhóm người lười biếng, trả lại luồng, trong java 8 không?
- 19. Làm thế nào để buộc SBT sử dụng Java 8?
- 20. Tái sử dụng đối tượng Java
- 21. Cách tạo luồng Java 8 từ trình lặp?
- 22. Cách sử dụng API Java 8 Stream trong Android 6.0
- 23. Java 8 tái cấu trúc các biểu thức lambda
- 24. Không có đoạn trích tái sử dụng nào?
- 25. Cách nhân giá trị trong danh sách bằng cách sử dụng java 8 suối
- 26. trong Java 8, làm cách nào tôi có thể nhận mảng int từ luồng <int[]> mà không cần sử dụng forEach
- 27. Lý do không có chỉ mục trong luồng Java 8 là gì?
- 28. Có thể sử dụng API Java 8 Streams để xử lý không đồng bộ không?
- 29. Làm cách nào để kiểm tra xem Java 8 Stream có trống không?
- 30. Ứng dụng Android có thể sử dụng java 8 lọ được biên dịch không?
Vâng, con suối có thể được tái sử dụng, chỉ khi bất kỳ ứng dụng nào không gọi bất kỳ thao tác đầu cuối nào trên đó. –
Bản sao có thể sao chép của luồng [Sao chép luồng để tránh "đã được vận hành theo hoặc đóng" (java 8)] (http://stackoverflow.com/questions/23860533/copy-a-stream-to-avoid-stream- đã-đã-được-vận hành-khi-hoặc-đóng-java-8) – Andrejs