在 Java 8 之前,方法的回傳類型大多為集合 (collection) 或其 subclass,如果該方法只有 for each 的需求,那可以使用 Iterable,如果有嚴格的性能要求,那可以使用陣列。Java 8 後新增 Stream,那若是將它作為方法的回傳型態呢? 可以,但當開發者要調用方法作 for each 動作時,會發現程式碼有點醜又更複雜。
for (String s : (Iterable<String>) strs.stream()::iterator) { }
可以使用 Adaptor 的方式,提供給開發者調用。同樣的,開發者會希望使用 Stream pipeline 來取代 Iterable 的狀況。// Stream -> Iterable
public static <T> Iterable<T> iterableOf(Stream<T> stream) {
return stream::iterator;
}
// Iterable -> Stream
public static <T> Stream<T> streamOf(Iterable<T> iterable) {
return StreamSupport.stream(iterable.spliterator(), false);
}
若是方法有明確的使用目的,就依目的來決定回傳類型,但如果是公開的 API,應該選用哪種回傳類型才適合? Collection 及其 subclass 是最適合的類型,Collection 介面繼承 Iterable,它亦包含 stream() 讓開發者可以調用。若回傳都是大筆的資料,回傳集合時可能會消耗大量的記憶體,就比較適合回傳 Iterable 或 Stream。轉載請註明原文網址 https://cookieandcoketw.blogspot.com/2021/03/effective-java-47-stream-collection.html
沒有留言:
張貼留言