2016-12-23 12 views
7

Tôi đang cố gắng để làm một cái gì đó như thế này:Tại sao không có IntStream.flatMapToObj()?

Stream<Object> stream = IntStream.of(...) 
     .flatMapToObj(i -> getStreamOfObjects(i)); 

Thật không may, IntStream.flatMapToObj() không tồn tại, thậm chí trong Java 9.

  1. Tại sao nó bị bỏ ra?
  2. Giải pháp được đề xuất là gì?

Trả lời

10

Tại sao nó bị bỏ quên?

API cung cấp các khối xây dựng có thể tái sử dụng. Các khối xây dựng có liên quan ở đây là IntStream, mapToObj, flatMap. Từ những điều này bạn có thể đạt được những gì bạn muốn: ánh xạ một luồng vào các đối tượng và sau đó lấy một bản đồ phẳng. Việc hoán vị các khối xây dựng sẽ không thực tế và khó mở rộng hơn.

Giải pháp được đề xuất là gì?

Như lời đề nghị trước đó, sử dụng các khối xây dựng sẵn (mapToObj + flatMap):

Stream<Object> stream = IntStream.of(...) 
    .mapToObj(i -> Stream.of(...)) 
    .flatMap(...); 
+2

Tốt câu trả lời. Tôi nghĩ rằng tôi vô thức giả định 'IntStream.flatMapToObj()' là cần thiết như 'Stream.flatMapToInt()', nhưng đó rõ ràng không phải là trường hợp. – shmosel

+2

'.flatMap (...)' này có thể là '.flatMap (Function.identity())' vì bạn đã ánh xạ tới các luồng với mapToObj –

+1

Tôi không bị thuyết phục bởi điều này - trong API chúng ta cho phương thức '.boxed()', nên loại bỏ sự cần thiết của '.mapToObj (...)' vì tất cả có thể được viết lại thành '.boxed(). map (...)'. Có vẻ như không phù hợp do đó đã cung cấp '.mapToObj()' ('.boxed(). Map (...)') nhưng không phải '.flatMapToObj()' ('.boxed(). FlatMap()'). – MrPotes

6

Chỉ cần viết

IntStream.of(...).mapToObj(i -> getStreamOfObjects(i)).flatMap(stream -> stream) 
6

Sử dụng một dòng suối đóng hộp sẽ có tác dụng nếu bạn không nhớ chi phí đấm bốc mỗi giá trị int.

Stream<Object> stream = IntStream.of(...).boxed().flatMap(i -> getStreamOfObjects(i)); 
Các vấn đề liên quan