第47条 Stream要优先用Collection作为返回类型
-
Stream
虽然有一个符合Iterable
接口的规定的用于遍历的方法, 但是Stream
却没有继承Interable
接口. -
Collection
接口是Iterable
的子类型, 还有一个stream
方法, 所以Collection
或其一个合适的子类型, 通常是返回序列的公有方法返回值的最好选择. -
不要把很大的序列放在内存中,比如"幂集"的实现:
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; } }; } }
思考
-
这一节主要介绍的是
Stream
和Iterable
的"不兼容性"。我感觉其实本身没有那么复杂,宗旨就是,方法的参数应该越抽象越好,返回值越具体越好。入参可以接受Workbook
、List
,就不要写成SXSSFWorkbook
、ArrayList
。相反应该尽量返回具体的实现,这样方便这个返回值可以被更多的方法使用。我们一般返回值都会是
List
而不是ArrayList
,感觉有两方面原因吧。第一是我们在定义结果的时候,就已经是这么定义的了List<String> result = new ArrayList<>()
,就限制了返回值最多只到List
。第二就是我们的所有正常开发全部都习惯了方法中,用util包的接口而不是具体实现作为参数和返回值,也就没有必要特意用ArrayList
作为返回值了放在这里其实就是,
Collection
既可以变成Stream
,又实现了Iterable
,所以用它作为返回值会有更好的兼容性,方便其他的方法继续使用
网友评论