第47條 Stream要優(yōu)先用Collection作為返回類型
Stream
雖然有一個符合Iterable
接口的規(guī)定的用于遍歷的方法, 但是Stream
卻沒有繼承Interable
接口.Collection
接口是Iterable
的子類型, 還有一個stream
方法, 所以Collection
或其一個合適的子類型, 通常是返回序列的公有方法返回值的最好選擇.-
不要把很大的序列放在內(nèi)存中嗓蘑,比如"冪集"的實現(xiàn):
public class PowerSet { // Returns the power set of an input set as custom collection (Page 218) public static final <E> Collection<Set<E>> of(Set<E> s) { List<E> src = new ArrayList<>(s); if (src.size() > 30) { throw new IllegalArgumentException("Set too big " + s); } return new AbstractList<Set<E>>() { @Override public int size() { return 1 << src.size(); // 2 to the power srcSize } @Override public boolean contains(Object o) { return o instanceof Set && src.containsAll((Set)o); } @Override public Set<E> get(int index) { Set<E> result = new HashSet<>(); for (int i = 0; index != 0; i++, index >>= 1) { if ((index & 1) == 1) { result.add(src.get(i)); } } return result; } }; } }
思考
-
這一節(jié)主要介紹的是
Stream
和Iterable
的"不兼容性"亿絮。我感覺其實本身沒有那么復雜兴革,宗旨就是壤追,方法的參數(shù)應該越抽象越好菊匿,返回值越具體越好。入?yún)⒖梢越邮?code>Workbook梅屉、List
鹅经,就不要寫成SXSSFWorkbook
、ArrayList
缤灵。相反應該盡量返回具體的實現(xiàn)伦籍,這樣方便這個返回值可以被更多的方法使用。我們一般返回值都會是
List
而不是ArrayList
腮出,感覺有兩方面原因吧帖鸦。第一是我們在定義結(jié)果的時候,就已經(jīng)是這么定義的了List<String> result = new ArrayList<>()
利诺,就限制了返回值最多只到List
富蓄。第二就是我們的所有正常開發(fā)全部都習慣了方法中剩燥,用util包的接口而不是具體實現(xiàn)作為參數(shù)和返回值慢逾,也就沒有必要特意用ArrayList
作為返回值了放在這里其實就是,
Collection
既可以變成Stream
灭红,又實現(xiàn)了Iterable
侣滩,所以用它作為返回值會有更好的兼容性,方便其他的方法繼續(xù)使用