Effective Java - Stream要优先用Colle

2022-07-16  本文已影响0人  DZQANN

第47条 Stream要优先用Collection作为返回类型

  1. Stream虽然有一个符合Iterable接口的规定的用于遍历的方法, 但是Stream却没有继承Interable接口.

  2. Collection接口是Iterable的子类型, 还有一个stream方法, 所以Collection或其一个合适的子类型, 通常是返回序列的公有方法返回值的最好选择.

  3. 不要把很大的序列放在内存中,比如"幂集"的实现:

    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;
                }
            };
        }
    }
    

思考

  1. 这一节主要介绍的是StreamIterable的"不兼容性"。我感觉其实本身没有那么复杂,宗旨就是,方法的参数应该越抽象越好,返回值越具体越好。入参可以接受WorkbookList,就不要写成SXSSFWorkbookArrayList。相反应该尽量返回具体的实现,这样方便这个返回值可以被更多的方法使用。

    我们一般返回值都会是List而不是ArrayList,感觉有两方面原因吧。第一是我们在定义结果的时候,就已经是这么定义的了List<String> result = new ArrayList<>(),就限制了返回值最多只到List。第二就是我们的所有正常开发全部都习惯了方法中,用util包的接口而不是具体实现作为参数和返回值,也就没有必要特意用ArrayList作为返回值了

    放在这里其实就是,Collection既可以变成Stream,又实现了Iterable,所以用它作为返回值会有更好的兼容性,方便其他的方法继续使用

上一篇下一篇

猜你喜欢

热点阅读