Java 8: Thực hành tốt để truyền Luồng xung quanh trong API cho các hoạt động lười biếng?


12

Trong các thư viện lambda nặng trước Java 8 như Guava, các kết quả đầu ra sử dụng các giao diện Khung công tác Java chung để dễ dàng chuyển chúng sang các API bên ngoài / bên trong và vẫn khai thác một số tính toán lười biếng nếu phương thức thư viện thực hiện (ví dụ như lười filter()transform()).

Tuy nhiên, trong Luồng Java 8, lệnh gọi lấy Collection/ Maplà thiết bị đầu cuối (tức là háo hức) và nó cũng sẽ phân bổ các cấu trúc dữ liệu mới để giữ kết quả.

Đối với các tính toán phức tạp với nhiều giai đoạn và mô hình chiến lược ở giữa, điều này gây ra rất nhiều phân bổ không cần thiết do kết quả trung gian.

Vì vậy, mọi người có nghĩ rằng đó là một cách thực hành tốt cho các API nội bộ (tức là các chiến lược mẫu chiến lược) để lấy và trả lại Streamcho tôi hay tôi chỉ nên dựa vào các API lười biếng nhưng không được sắp xếp hợp lý (tôi dự định chơi chữ)?

Biên tập:

Mối quan tâm chính của tôi Streamlà nó chỉ có thể được tiêu thụ một lần và vượt qua một cái gì đó Supplier<Stream<X>>trông có vẻ cực kỳ cồng kềnh. Nó gần như thúc đẩy bạn chỉ cần vượt qua Collectionvà sau đó trả lại stream()(và trả chi phí đánh giá háo hức vào thời điểm đó).


Điều gì, ổi và bạn bè không được cập nhật để tận dụng các luồng bản địa?
Kilian Foth

1
Có các giao diện nhận và trả lại luồng thực sự cải thiện khả năng tương tác với các chức năng luồng tiêu chuẩn. Nó cho phép bạn tích hợp các cuộc gọi đến giao diện của bạn vào một đường truyền phát trực tuyến.
Philipp

@KilianFoth Đã không có bất kỳ bản phát hành ổi nào trong gần một năm và có nhiều bài viết phổ biến về việc thay thế công cụ lambda của Guava bằng Stream; tuy nhiên không ai trong số họ giải quyết thực tế rằng các hoạt động thu gom ổi có thể háo hức hoặc lười biếng.
billc.cn

Câu trả lời:


3

Sự lười biếng trong Luồng Java 8 hoạt động giống như trước đây đối với Iterables trong Guava: bạn phải truyền Iterable để không bị lười biếng và đánh giá xảy ra, khi bạn xây dựng Bộ sưu tập từ Iterator. Cả Stream và Iterators chỉ có thể được tiêu thụ một lần.

Vì vậy, đối với các giao diện phương thức của bạn, cách tổng quát hơn (cho phép sự lười biếng) là sử dụng giao diện Luồng (bất cứ khi nào bạn đã sử dụng Iterable trước đó). Như @Philipp nói, điều này cho phép chúng được sử dụng trong các đường ống Stream.

Hy vọng, vì Stream bây giờ là giao diện chuẩn Java chính thức, sẽ có ngày càng nhiều thư viện và hàm khác có thể hoạt động hiệu quả trên Stream trực tiếp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.