2015-01-27 23 views
6

Trong Java 8, tôi đang thay thế Collection giá trị trả lại bằng Stream.Trả lại luồng thay vì danh sách

Vì vậy, nơi tôi sẽ một lần đã có:

public List<Element> getElementList() { 
    return elements; 
} 

bây giờ tôi đang sử dụng:

public Stream<Element> streamElements() { 
    return elements.stream(); 
} 

lập luận của tôi cho đây là:

  1. Nó thực thi tính bất biến của các cơ bản list
  2. Nó giấu thực tế là có danh sách cơ bản. Sau này nó có thể được thay đổi thành một tập hợp hoặc một số cấu trúc khác mà không thay đổi chữ ký phương thức.
  3. Nó độc đáo đóng gói mà người dùng của phương pháp dự kiến ​​sẽ làm điều gì đó với các mục không phải là một cái gì đó với một danh sách.
  4. Nó có thể song song một cách trivially sau này nếu được yêu cầu.

Trong thực tế hiện nay, trong mã của tôi, trả lại một List hoặc một số khác bộ sưu tập là một cách rõ ràng một sự công nhận mà người dùng có thể xem xét các bộ sưu tập có thể thay đổi và dự kiến ​​để có thể thay đổi nó.

Rõ ràng một số điều này có thể đạt được với các bộ sưu tập không thay đổi.

Câu hỏi của tôi là: ai có thể thấy bất kỳ bất lợi nào với thiết kế này không? Có lợi thế nào về các bộ sưu tập không thể thay đổi khi trả lại một số Stream không?

+2

trả lời ở đây: http://stackoverflow.com/questions/24676877/should-i-return-a-collection-or-a-stream/24679745#24679745 –

+0

@BrianGoetz Tôi có thể có chữ ký của bạn xin vui lòng: P –

+1

Xem thêm http://stackoverflow.com/q/27179175/2711488 – Holger

Trả lời

10

Tôi không nói rằng bạn không nên trả về một Stream, và thậm chí ít hơn mà bạn không bao giờ phải trả lại một Stream, nhưng làm nó cũng có nhiều nhược điểm:

  • nó không cho người sử dụng API nếu bộ sưu tập được đặt hàng (Danh sách) hoặc không (Set) hoặc được sắp xếp (SortedSet)
  • nó không cho người dùng biết API nếu bộ sưu tập có thể chứa bản sao (Danh sách) hoặc không (Set)
  • nó không cho phép người dùng truy cập dễ dàng và nhanh chóng phần tử đầu tiên hoặc cuối cùng của danh sách hoặc thậm chí biết kích thước của nó.
  • nếu người dùng API cần thực hiện nhiều lần vượt qua bộ sưu tập, anh ấy buộc phải sao chép mọi phần tử vào bộ sưu tập mới.

Tôi muốn nói rằng chọn trả lại luồng thay vì tập hợp cũng phụ thuộc vào những gì bạn đã có. Nếu bộ sưu tập đã được materialized (suy nghĩ về một thực thể JPA có OneToMany đã được materialized như một Set), tôi có lẽ sẽ trở lại một wrapper immutable trên bộ sưu tập. Mặt khác, nếu bộ sưu tập cần trả lại là kết quả của việc tính toán hoặc chuyển đổi một bộ sưu tập khác, việc trả lại luồng có thể là lựa chọn tốt hơn.

+0

Đây là một câu trả lời hay và tôi đã chấp nhận nó nhưng đã đọc câu trả lời khác rõ ràng rằng đây thực sự là một câu hỏi trùng lặp. Có nói rằng tôi thích câu trả lời của bạn cho người khác để bạn có thể muốn đăng lại ở đó. – sprinter

+0

+1: Câu trả lời của Brian Goetz ủng hộ mạnh mẽ 'Stream', nhưng trên thực tế, lý do thực sự hấp dẫn nhất để đi với Stream là sự lười biếng. Về cơ bản, Stream là một cải tiến trên * Iterator * nhiều hơn * Bộ sưu tập *. –

1

tôi có thể nghĩ đến một vài trường hợp:

  1. Khi người gọi thực sự muốn "có được và giữ" các giá trị thay vì xử lý chúng chỉ một lần.
  2. Khi trở về mỗi lần một đối tượng mới không được chấp nhận đối với bộ nhớ hoặc vấn đề hiệu suất, khi trả về một đối tượng tĩnh là thích hợp hơn (điều này có thể cho máy tính hiệu suất cao hoặc nơi bạn muốn có thời gian xử lý xác định trong phương pháp) có GC tối thiểu).

Nhưng có quá trình xử lý có thể được đơn giản hóa.

Các vấn đề liên quan