函数式编程
Stream流的三类方法：
    1、获取Stream流
        创建了一条流水线
    2、中间方法
        在流水线上进行的操作
        一次操作后，还可以继续进行操作
    3、终结方法
        一个Stream流只能有一个终结方法
        是流水线上最后一个操作

一部分：生成Stream流的方式：
    1、Collection体系的集合
        可以使用默认方法stream()生成流
        default Stream<E> stream()
    2、Map体系集合
        把Map转换成Set集合，间接的生成流
    3、数组
        通过Arrays类中的静态方法stream()生成流
    4、同种数据类型的多个数据
        通过Stream接口的静态方法of(T...values)生成流

二部分：中间操作方法
        中间操作的意思，执行完毕当前的方法后，Stream可以继续执行其他操作
        Stream<T> filter()  对流中的数据进行过滤
        Stream<T> limit()   返回这个流中的元素组成的流，截取指定参数个数的数据
        Stream<T> skip()    跳过指定参数个数的数据，返回有该流剩余的元素组成的流
        static<T> Stream<T> concat(Stream a,Stream b) 合并a和b两个流为一个流
        Stream<T> distinct()    返回这个流的不同元素(使用equals比较)组成的流

三部分：终结操作
    终结操作指的是操作玩次方法后，Stream流就不能再执行其他操作了。
    void forEach(Consumer action)   对当前流的每个元素执行操作
    long count()    返回当前流中的元素数


收集操作
    把数据使用Stream流的方式操作完毕后，再把流中的数据收集到集合中。
    R collect(Collector collector)  把结果收集到集合中。

    工具类Collectors提供了具体的收集方式：
    public static<T> Collector toList() 把元素收集到List集合
    public static<T> Collector toSet() 把元素收集到List集合
    public static<T> Collector toMap() 把元素收集到List集合


引用类的静态方法
    类名::方法名
    System.out::println
    使用它的前提：
    如果我们在重写方法的时候，方法体只有一行代码，并且这个代码是调用了某个类的静态方法，
    并且我们要重写的抽象方法中所有的参数都是按照顺序传入到了这个静态方法中，这个时候我们就可以引用类的静态方法



