Trong khi phát triển API của tôi không bị ràng buộc với bất kỳ mã kế thừa nào, tôi thường thấy mình viết các phương thức hoàn toàn là đường truyền Streams bị chấm dứt bằng cách thu thập kết quả. Như cái này:
ImmutableSet<T> deriveSomethingMeaningfulFromPrivateState() {
return myPrivateThingies.stream()
.map(this::ownerOfThing)
.map(Owner::socialStatus)
.filter(SocialStatus::isHeAFineMatey)
.collect(MyCustomCollectors.toImmutableSet());
}
Bây giờ, hầu hết các máy khách của lớp này thường sẽ cần Bộ sưu tập (trong trường hợp này là Bộ không thay đổi) để tìm kiếm các phần tử và lặp lại trên nó, nhưng một số khách hàng có thể được hưởng lợi từ việc có Luồng để họ có thể đưa thêm một số hoạt động lên trên đó Truyền phát mà không cần lấy luồng mới từ Bộ sưu tập. Vì vậy, việc trả lại một luồng cung cấp cho các nhân viên một siêu lựa chọn mà họ sẽ có nếu họ chỉ có Bộ sưu tập (sau tất cả, họ luôn có thể collect()
tự tạo Luồng:
Stream<T> deriveSomethingMeaningfulFromPrivateState() {
return myPrivateThingies.stream()
.map(this::ownerOfthing)
.map(Owner::socialStatus)
.filter(SocialStatus::isHeAFineMatey);
// No collect
}
Cách tiếp cận này rất hấp dẫn đối với tôi để thử vì tôi không thấy bất kỳ sai sót tiềm năng nào mà nó có thể có. Tuy nhiên, tôi chưa bao giờ thấy cách tiếp cận này trong bất kỳ thư viện nào (có lẽ vì không có nhiều thư viện được phát hành sau khi xuất hiện Java 8), vì vậy tôi hơi ngại khi áp dụng nó. Các lớp thư viện hiện có thường trả về Bộ sưu tập khi chúng lấy được thứ gì đó từ trạng thái riêng.
Có điều gì đó tồi tệ có thể xảy ra nếu tôi quyết định trả lại Luồng bất cứ nơi nào bản thân tiền Java-8 của tôi sẽ trả lại Bộ sưu tập không? Hoặc có lẽ tôi đang làm một cái gì đó của một antipotype ở đây với tất cả những gì xuất phát từ trạng thái riêng tư?