一、min()
 /**
   * min():取流中最小值
   */
  @Test
  void test1(){
    List<Integer> list = List.of(1,4,2,8,5);
    Integer num = list.stream().min((o1, o2) -> o1.compareTo(o2)).get();
    System.out.println(num); //1
  }
二、max()
 /**
   * max():取流中的最大值
   */
  @Test
  void test2(){
    System.out.println(list.stream().max((o1, o2) -> o1.compareTo(o2)).get());
      //8
  }
三、findFirst()
/**
   * FindFirst():取流中的第一个值
   */
  @Test
  void test3(){
    List<Integer> list = Arrays.asList(1, 4, 2, 8, 5);
    //获取串行流
    Integer num1 = list.stream().findFirst().get();
    System.out.println(num1);  //  1
    //获取并行流
    Integer num2 = list.parallelStream().findFirst().get();
    System.out.println(num2);   // 1
  }
四、findAny()
 /**
   * FindAny():获取流中任何一个数
   *
   * 在并行流中,findany()返回的是处理的最快的线程的数据,并行流适用于对于顺序没有严格要求的操作
   */
  @Test
  void test4() {
    List<Integer> list = Arrays.asList(1, 4, 2, 8, 5);
    //获取串行流
    Integer num1 = list.stream().findAny().get();
    System.out.println(num1);  //  1
    //获取并行流
    Integer num2 = list.parallelStream().findAny().get();
    System.out.println(num2);   // 2
  }
五、map()
@Data
  @AllArgsConstructor
  @NoArgsConstructor
  static class User {

    private String name;
    private Integer age;
  }
  /**
   * map():调用此方法可以改变返回的类型
   */
  @Test
  void test5() {
  

    /**
     * 将asList中的数据由字符串修改为int
     */
    List<String> asList = Arrays.asList("1", "2", "5", "4");
    asList.stream().map(str -> Integer.parseInt(str)).forEach(str -> {
      System.out.println(str);
      System.out.println(str.getClass());
    });
    /**
     * 将list中的对象的中name打印出来
     */
    List<User> list = List.of(new User("张三", 13), new User("李四", 36), new User("王五", 12));
    list.stream().map(user -> user.getName()).forEach(name -> {
      System.out.println(name);
    });

  }
六、filter()
 /**
   * filter():对流进行过滤
   */
  @Test
  void tst6() {

    /**
     * 将年龄大于等于13的用户的名字打印出来
     */
    List<User> list = List.of(new User("张三", 13), new User("李四", 36), new User("王五", 12));
    list.stream().filter(user -> user.getAge() >= 13).forEach(user -> {
      System.out.println(user.getName());//张三、李四
    });
  }
七、flatMap()
  /**
   * flatMap():把两个流改变为一个流
   */
  @Test
  void tst7() {
    List<String> stringList = new ArrayList<>();
    stringList.add("aa");
    stringList.add("bb");
    stringList.add("cc");
    stringList.stream().map(str -> str.split("")).flatMap(st -> Arrays.stream(st)).forEach(System.out::print);
    //aabbcc
  }
八、anyMatch()
  /**
   * anyMatch():判断条件中,任意一个匹配,则返回true
   */
  @Test
  void tst() {
    List<String> a = List.of("a", "a", "a");
    List<String> b = List.of("a", "a", "a","b");
    boolean mark1 = a.stream().anyMatch(o -> o.equals("a"));
    System.out.println(mark1); //true
    boolean mark2= b.stream().anyMatch(o -> o.equals("a"));
    System.out.println(mark2);  //true
  }
九、allMatch()
  /**
   * allMatch():判断条件中,所有元素匹配才返回true
   */
  @Test
  void tst9() {
    List<String> a = List.of("a", "a", "a");
    List<String> b = List.of("a", "a", "a", "b");
    boolean mark1 = a.stream().allMatch(o -> o.equals("a"));
    boolean mark2 = b.stream().allMatch(o -> o.equals("a"));
    System.out.println("mark1:" + mark1 + "----mark2:" + mark2);//mark1:true----mark2:false
  }
十、nonMatch()
  /**
   * nonMatch():判断条件都不满足,则返回true
   */
  @Test
  void tst10(){
    List<String> b = List.of("a", "a", "a", "b");
    boolean mark = b.stream().noneMatch(o -> o.equals("c"));
    System.out.println(mark);//true
  }
十一、sorted()
/**
   * sorted():排序
   */
  @Test
  void tst11() {
    List<User> users = new ArrayList<>();
    users.add(new User("张三", 12));
    users.add(new User("李四", 15));
    users.add(new User("王五", 13));
    //升序:
    Stream<User> sorted1 = users.stream().sorted(Comparator.comparingInt(User::getAge));
    sorted1.forEach(System.out::println);
    System.out.println("-------------");
    //降序:
    Stream<User> sorted2 = users.stream().sorted(Comparator.comparingInt(User::getAge).reversed());
    sorted2.forEach(System.out::println);
  }
十二、peek()
 /**
   * peek():对对象的属性进行操作
   */
  @Test
  void tst12() {
    List<User> users = new ArrayList<>();
    users.add(new User("张三", 12));
    users.add(new User("李四", 15));
    users.add(new User("王五", 13));

    //对年龄大于12的用户在原基础上年龄再加5
    List<User> userList = users.stream().filter(o -> o.getAge() > 12).peek(user -> {
      user.setAge(user.getAge() + 5);
    }).collect(Collectors.toList());
    System.out.println(userList);
      //[DemoApplicationTests.User(name=李四, age=20), DemoApplicationTests.User(name=王五, age=18)]
  }
十三、limit()、skip()
/**
   * limit():截取,skip():跳过
   */
  @Test
  void tst13(){
    //从1开始自增无线迭代,跳过前5个数,截取10个数
    Stream.iterate(1,x->++x).skip(5).limit(10).forEach(System.out::print);
  }
//6789101112131415
十四、reduce()
 /**
   * reduce():Stream的一个聚合方法,它可以把一个Stream的所有元素按照聚合函数聚合成一个结果。
   */
  @Test
  void tst14(){
    List<Integer> list = Stream.iterate(1, x -> ++x).limit(10).collect(Collectors.toList());
    //计算list里面的元素的总和
    Integer reduce = list.stream().reduce(0, (a, b) -> a + b);
    System.out.println(reduce);

    //传统计算list元素总和方法
    int a=0;
    for (Integer integer : list) {
      a += integer;
    }
    System.out.println(a);
  }