* Stream的三个操作步骤

* 1、创建Stream

* 2、中间操作

* 3、终止操作(终端操作)
    
     List<Student> students = Arrays.asList(
           new Student("张三", "男", 11),
           new Student("李四", "女", 11),
           new Student("王五", "男", 22),
           new Student("赵六", "女", 21),
           new Student("赵六", "女", 21),
           new Student("赵六", "女", 21));
    //中间操作
 /*
   筛选与切片
   filter--接收Lambda,从流中排除某些元素。
   limit--截断流,使其元素不超过给定数量
   skip(n)--跳过元素,返回一个扔掉了前n个元素的流。若流中元素不足n个,则返回一个空流。与limit(n)互补
   (跳过N个,从N+1个开始取)
   distinct--筛选,通过流所生成元素的hashcode和equals去除重复元素
  */
  // filter
    students.stream().filter(x->x.getAge>15).foreach(System.out::println);
       //中间操作:不会执行任何操作
       /*
       * 多个中间操作可以连接起来形成一个流水线,除非流水线上出发终止操作,否则中间操作不会执行任何的处理!
       * 而在终止操作一次性全部处理,成为”惰性求值“,延迟加载。
       * */
  //limit
     students.stream().filter(x->x.getAge>15).limit(10).foreach(System.out::println);
   //skip
     students.stream().filter(x->x.getAge>15).skip(10).foreach(System.out::println);
   //distinct
     tudents.stream().filter(x->x.getAge>15).skip(10).distinct().foreach(System.out::println);

     /*
   *
   * 映射
   * Map --接受lambda,将元素转换成其他形式或提取信息。接受一个函数作为参数,该函数会被应用到每个元素上,应将其映射成一个新的元素
   * */
    students.stream().map(Student::getName)
               .skip(2)
               .distinct()
               .forEach(System.out::println);
     List<String> strs = Arrays.asList("asd", "adsa", "ssss", "dddd");
     strs.stream().map(String::toUpperCase).forEach(System.out::println);

     /*
   * 排序
   *sorted()--自然排序
   * sorted(comparator com)--定制排序
   */
   List<String> strs = Arrays.asList("aaa", "zzzz", "eeee", "hhhhh", "bbbbb");
       strs.stream().sorted().forEach(System.out::println);

       System.out.println("------------------------------------------------");

       students.stream()
               .distinct()
               .sorted((x,y)-> {
                       //如果不知道传几个参数可以查看抽象接口
                   if (x.getAge().equals(y.getAge())) {
                      return  -x.getName().compareTo(y.getName());
                   }else
                       return  x.getName().compareTo(y.getName());
               }).forEach(System.out::println);