2015-11-26 17 views
25

Tôi muốn thêm một luồng với tùy chọn. Kể từ Stream.concat chỉ có thể concatinate Streams Tôi có câu hỏi này:Làm thế nào để chuyển đổi một tùy chọn <T> thành một dòng <T>?

Làm thế nào để chuyển đổi một tùy chọn < T> vào một Stream < T>?

Ví dụ:

Optional<String> optional = Optional.of("Hello"); 
// or Optional<String> optional = Optional.empty(); 
Stream<String> texts = optional.stream(); // not working 
+1

Xem http://stackoverflow.com/questions/22725537/using-java-8s-optional-with-streamflatmap –

+0

Câu hỏi đó thực sự trả lời câu hỏi này, nhưng nó trình bày một ví dụ phức tạp hơn. Tôi nghĩ cái này đáng để giữ cho trường hợp đơn giản. –

Trả lời

28

Trong Java-9 thiếu phương pháp stream() được thêm , do đó, mã này hoạt động:

Stream<String> texts = optional.stream(); 

Xem JDK-8050820. Tải xuống Java-9 Early Access để xây dựng here.

63

Trong Java 8 bạn có thể làm điều này:

Stream<String> texts = optional.map(Stream::of).orElseGet(Stream::empty); 
+1

Tôi upvoted này bởi vì Java 9 có một số thay đổi không tương thích ngược cho một số dự án ở trạng thái hiện tại của họ. Một số dự án, chẳng hạn như [lombok] (https://github.com/rzwitserloot/lombok/issues/985), là một phần của các hiện vật cốt lõi của công ty mà chậm được thay đổi. –

3

Bạn có thể làm:

Stream<String> texts = optional.isPresent() ? Stream.of(optional.get()) : Stream.empty(); 
+9

Tôi không phải là một fan hâm mộ lớn của 'isPresent', nó cảm thấy giống như một phương pháp di sản đối với tôi và nhắc tôi về những thời điểm trước Java8. Nhưng cảm ơn vì đã cung cấp giải pháp thay thế. – slartidan

2

tôi có thể khuyên Guava 's Streams.stream(optional) phương pháp nếu bạn không sử dụng Java 9. Một ví dụ đơn giản:

Streams.stream(Optional.of("Hello")) 

Cũng có thể tĩnh nhập khẩu Streams.stream, vì vậy bạn chỉ có thể viết

stream(Optional.of("Hello")) 
Các vấn đề liên quan