Bằng cách viết ứng dụng trong Java, có nhiều trường hợp sử dụng cho java.util.Collection
. Kể từ khi java.util.stream.Stream
được giới thiệu với Java 8, tôi đã gặp một số trường hợp sử dụng, nơi rất khó để quyết định sử dụng.Quyết định giữa việc sử dụng Luồng hoặc Vòng lặp
Ví dụ: Bạn sẽ viết một số phương pháp sử dụng.
public static List<?> filterHashToList(int hash, Collection<?> toFilter) {
return toFilter.stream()
.filter((Object o) -> hash == o.hashCode())
.collect(Collectors.toCollection(LinkedList::new));
}
gì về cách viết nó như thế này:
public static List<?> filterHashToList(int hash, Collection<?> toFilter) {
List<Object> result = new LinkedList<>();
for(Object o : toFilter) {
if(hash == o.hashCode()) {
result.add(o);
}
}
return result;
}
Cả hai phương pháp sẽ tạo ra kết quả tương tự. java.util.stream.Stream
và java.util.stream.Collector
là các giao diện, do đó, việc triển khai cũng có thể khác nhau nếu tôi sử dụng các luồng tùy chỉnh và bộ sưu tập.
Tôi nghĩ rằng có vô số triển khai ngoài đó bằng cách sử dụng vòng lặp cũ fashoined.
Vì vậy, có thể trả lời những gì cần sử dụng, phát trực tiếp hoặc lặp lại, theo trường hợp sử dụng không? Và nếu có, tất cả các triển khai phải được cập nhật khi thích hợp không?
Hoặc tôi có nên cung cấp cả hai cách bằng cách triển khai các phương thức util? Hoặc tôi cũng nên cung cấp một người trả lại luồng sau quá trình lọc để bạn có thể làm việc với luồng đó nếu cần?
Bạn có thể có song song thực sự dễ dàng với Luồng, chúng nhỏ gọn hơn (một số có thể nói "dễ đọc hơn") và có thêm lợi thế, nếu Luồng của bạn là "luồng" thực tế (thứ gì đó đang chảy, động) - không dựa trên bộ sưu tập cố định như ở đây). Nhưng trong trường hợp cụ thể của bạn, tôi nghĩ bạn có thể đi theo một trong hai cách. – mastov
Vì vậy, chúng tôi có thể rút ngắn điều đó thành: Luồng sẽ được ưu tiên hơn, nhưng trong trường hợp sử dụng dễ dàng cả hai đều ổn chứ? – narranoid
Tôi sẽ sử dụng hai quy tắc đơn giản: 1. nếu nó không bị hỏng, đừng sửa nó. 2. sử dụng những gì bạn thấy dễ đọc nhất và có thể bảo trì. Điều đó nói rằng, hai ví dụ của bạn không trả lại cùng một thứ: một trả về một ArrayList, và một ví dụ khác trả về một LinkedList. –