美文网首页
Effective Java - Stream要优先用Colle

Effective Java - Stream要优先用Colle

作者: DZQANN | 来源:发表于2022-07-16 23:16 被阅读0次

    第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,所以用它作为返回值会有更好的兼容性,方便其他的方法继续使用

    相关文章

      网友评论

          本文标题:Effective Java - Stream要优先用Colle

          本文链接:https://www.haomeiwen.com/subject/rclrirtx.html