這是本文件的舊版!


Effective Java - Prefer Collection to Stream as a return type (working..)

如標題所示,這item希望在設計回傳type時,能傾向用Collection而不是Stream。第一個探討的是iterator的使用。假如要使用for each,你需要寫醜醜的code去做轉型,才能通過compiler:

for (ProcessHandle ph : (Iterable<ProcessHandle>)ProcessHandle.allProcesses()::iterator)
..
假如要避免這種寫法,可以寫一個adapter去做這件事情;但同時你可能也會需要Stream to Interable:
public static <E> Stream<E> streamOf(Iterable<E> iterable) {
	return StreamSupport.stream(iterable.spliterator(), false);
}
public static <E> Stream<E> streamOf(Iterable<E> iterable) {
	return StreamSupport.stream(iterable.spliterator(), false);
}
在書中這裡也討論到使用Files.lines會忽略讀取時所有的例外,如果要使用這種寫法,你就必須接受這個問題。

回到method介面的設計。Collection interface除了是Iterable的sub-type外,也提供了轉stream的method。因此,如果你確定client就是要使用stream的方式,那就回傳stream;如果你無法確定,而且你是要開發通用的API,請考慮Collection或是其衍伸類別/介面。

Effective Java第三版Item 47。

  • Effective Java, 3/e