首页 > 编程语言 >学习笔记-Java8新特性-第四节-StreamAPI

学习笔记-Java8新特性-第四节-StreamAPI

时间:2023-05-21 23:24:52浏览次数:47  
标签:stream employees System Employee println StreamAPI 第四节 Java8 out

StreamAPI

  • 利用StreamAPI可以像流水线一样操作处理数据源(数组、集合……)

  • Stream自己不会存储元素

  • Stream不会改变数据源,而是会返回一个持有处理结构的新Stream

  • Steam操作时延迟执行的,他们会等到需要结果的时候才执行

    • 称为惰性求值

Stream操作的三个步骤

  • 创建Stream

    • 一个数据源(如:集合、数组),获取一个流
  • 中间操作

    • 一个中间操作链,对数据源的数据进行处理
  • 终止操作

    • 一个终止操作,执行中间操作链,并产生结果

创建Stream

  • 通过Collection系列集合提供的stream()或paralleStream()

    •         List<String> list = new ArrayList<>();
              Stream<String> stream = list.stream();
      
  • 通过Arrays中的静态方法stream()获取数组流

    •         Employee[] employees = new Employee[10];
              Stream<Employee> stream1 = Arrays.stream(employees);
      
  • 通过Stream类中的静态方法of()

    •         Stream<String> stream2 = Stream.of("aa", "bb", "cc");
      
  • 创建无限流

    •         //1.迭代
              //获取正偶数的无限流
              Stream<Integer> stream3 = Stream.iterate(0, (x) -> x + 2);
              stream3.limit(10).forEach(System.out::println);
      
              //2.生成
              //获取随机数
              Stream.generate(() -> Math.random())
                      .limit(5)
                      .forEach(System.out::println);
      

中间操作

筛选与切片

  • filter——接收断言型Lambda,从流中排除某些元素

    •     public void test1() {
              //过滤,保留年龄大于35的员工
              employees.stream()
                      .filter((e) -> {
                          System.out.println("StreamAPI的中间操作");
                          return e.getAge() > 35;
                      })
                      .forEach(System.out::println);
          }
      
  • limit——截断流,使其元素不超过给定数量

    •     public void test2() {
              //截取,保留2个
              employees.stream()
                      .limit(2)
                      .forEach(System.out::println);
          }
      
  • skip——跳过,扔掉前n个元素

    •     public void test3() {
              //跳过,扔掉前2个
              employees.stream()
                      .skip(2)
                      .forEach(System.out::println);
          }
      
  • distinct——去重,通过hashCode()和equals()判断是否相等

    •     @Test
          public void test4() {
              //去重
              employees.stream()
                      .distinct()
                      .forEach(System.out::println);
          }
      

映射

  • map——接受一个Lambda,将元素转换成其他形式或提取信息

    • 接收一个函数作为参数,该函数会被应用到每个元素上,并映射成一个新的元素

    •     public void test5() {
              List<String> list = Arrays.asList("aa", "bb", "ccc", "ddd", "eee");
      
              list.stream()
                      .map((s) -> s.toUpperCase())
                      .forEach(System.out::println);
      
              System.out.println("_________________");
      
              employees.stream()
                      .map(Employee::getName)
                      .forEach(System.out::println);
      
          }
      
  • flatMap

    • 接收一个函数作为参数,将流中的每一个值都换成另一个流,然后把所有流连接成一个流

    •     public void test6() {
              List<String> list = new ArrayList<>();
              list.add("aaa");
              list.add("bbb");
      
              list.stream()
                      //返回值为Stream<Stream<Character>>
                      .map(TestStreamAPI2::filterCharacter)
                      .forEach((characterStream) -> {
                          characterStream.forEach(System.out::println);
                      });
      
              System.out.println("------------------------");
      
              list.stream()
                      //返回值为Stream<Character>
                      .flatMap(TestStreamAPI2::filterCharacter)
                      .forEach(System.out::println);
          }
      
          public static Stream<Character> filterCharacter(String str) {
              List<Character> list = new ArrayList<>();
      
              for(Character ch : str.toCharArray()) {
                  list.add(ch);
              }
      
              return list.stream();
          }
      

排序

  • sorted()——自然排序(Comparable)

  • sorted(Comparator cmp)——定制排序

  •     public void test7() {
            List<String> list = Arrays.asList("bbb", "aaa", "ddd", "eee", "ccc");
    
            list.stream()
                    .sorted()
                    .forEach(System.out::println);
    
            System.out.println("---------------------");
    
            employees.stream()
                    .sorted((e1, e2) -> {
                        if(e1.getAge() == e2.getAge()) {
                            return e1.getName().compareTo(e2.getName());
                        } else {
                            return Integer.compare(e1.getAge(), e2.getAge());
                        }
                    })
                    .forEach(System.out::println);
    
        }
    

终止操作

查找与匹配

  • allMatch——检查是否匹配所有元素

  • anyMatch——检查是狗至少匹配一个元素

  • noneMatch——检查是否没有匹配所有元素

  • findFirst——返回第一个元素

  • findAny——返回当前流中的任意元素

    •     List<Employee> employees = Arrays.asList(
                  new Employee("张三", 18, 9999.99, Employee.Status.FREE),
                  new Employee("李四", 38, 5555.55, Employee.Status.BUSY),
                  new Employee("王五", 50, 6666.66, Employee.Status.VOCATION),
                  new Employee("赵六", 16, 3333.33, Employee.Status.FREE),
                  new Employee("田七", 8, 7777.77, Employee.Status.BUSY)
          );
      
          @Test
          public void test1() {
              boolean b1 = employees.stream()
                      .allMatch((e) -> e.getStatus().equals(Employee.Status.BUSY));
              System.out.println(b1);
      
              boolean b2 = employees.stream()
                      .anyMatch((e) -> e.getStatus().equals(Employee.Status.BUSY));
              System.out.println(b2);
      
              boolean b3 = employees.stream()
                      .noneMatch((e) -> e.getStatus().equals(Employee.Status.BUSY));
              System.out.println(b3);
      
              Optional<Employee> first = employees.stream()
                      .sorted(Comparator.comparingDouble(Employee::getSalary))
                      .findFirst();
              System.out.println(first);
      
              Optional<Employee> any = employees.parallelStream()
                      .filter((e) -> e.getStatus().equals(Employee.Status.BUSY))
                      .findAny();
              System.out.println(any);
      
          }
      
  • count——返回流中元素的总个数

  • max——返回流中的最大值

  • min——返回流中的最小值

    •     public void test2() {
              long count = employees.stream()
                      .count();
              System.out.println(count);
      
              Optional<Employee> max = employees.stream()
                      .max(Comparator.comparingDouble(Employee::getSalary));
              System.out.println(max);
      
              Optional<Double> min = employees.stream()
                      .map(Employee::getSalary)
                      .min(Double::compare);
              System.out.println(min);
          }
      

规约

  • reduce(T identity, BinaryOperator) / reduce(BinaryOperator)

    • 将流中的元素反复结合起来,得到一个值

    • identity代表一个初始值

    •     public void test3() {
              List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
      
              Integer sum = list.stream()
                      .reduce(0, Integer::sum);
              System.out.println(sum);
      
              System.out.println("-------------------");
      
              Optional<Double> op = employees.stream()
                      .map(Employee::getSalary)
                      .reduce(Double::sum);
              System.out.println(op.get());
          }
      

收集

  • collect——将流转换为其他形式

    • 接收一个Collector接口的实现

      • 使用对应的静态类Collectors提供的静态方法,可以方便地创建Collector实例
    • 用于给Stream中元素做汇总的方法

    •     public void test4() {
              List<String> list = employees.stream()
                      .map(Employee::getName)
                      .collect(Collectors.toList());
              list.forEach(System.out::println);
      
              System.out.println("------------------");
      
              Set<String> set = employees.stream()
                      .map(Employee::getName)
                      .collect(Collectors.toSet());
              set.forEach(System.out::println);
      
              System.out.println("------------------");
      
              HashSet<Employee.Status> hashSet = employees.stream()
                      .map(Employee::getStatus)
                      .collect(Collectors.toCollection(HashSet::new));
              hashSet.forEach(System.out::println);
      
          }
      
    •     public void test5() {
              Double avg = employees.stream()
                      .collect(Collectors.averagingDouble(Employee::getSalary));
              System.out.println(avg);
      
              System.out.println("_________________________");
      
              Double sum = employees.stream()
                      .collect(Collectors.summingDouble(Employee::getSalary));
      
          }
      
    •     @Test
          public void test6() {
              // 分组
              Map<Employee.Status, List<Employee>> collect = employees.stream()
                      .collect(Collectors.groupingBy(Employee::getStatus));
              System.out.println(collect);
      
              // 多级分组
              Map<Employee.Status, Map<String, List<Employee>>> collect1 = employees.stream()
                      .collect(Collectors.groupingBy(Employee::getStatus, Collectors.groupingBy((e) -> {
                          if (e.getAge() <= 35) {
                              return "青年";
                          } else if (e.getAge() <= 50) {
                              return "中年";
                          } else {
                              return "老年";
                          }
                      })));
              System.out.println(collect1);
      
          }
      
    •     public void test7() {
              // 分区
              Map<Boolean, List<Employee>> collect = employees.stream()
                      .collect(Collectors.partitioningBy((e) -> e.getSalary() > 5000));
              System.out.println(collect);
          }
      
    •     public void test8() {
              // 统计
              DoubleSummaryStatistics statistics = employees.stream()
                      .collect(Collectors.summarizingDouble(Employee::getSalary));
      
              System.out.println(statistics.getSum());
              System.out.println(statistics.getAverage());
              System.out.println(statistics.getMax());
          }
      
    •     public void test9() {
              // 字符串处理
              String collect = employees.stream()
                      .map(Employee::getName)
                      .collect(Collectors.joining(",", "===", "==="));
              System.out.println(collect);
              // ===张三,李四,王五,赵六,田七===
          }
      

并行流与顺序流

  • 并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流

  • 底层使用到了Fork/Join框架

    • 使用了工作窃取模式

      • 将小任务分成了数个线程队列

      • 当某个线程队列处理完成后,会从其他没有完成的线程队列末尾偷取任务

Fork/Join

  • 可以使用parallel方法将流切换到并行模式

  • 提高工作效率

标签:stream,employees,System,Employee,println,StreamAPI,第四节,Java8,out
From: https://www.cnblogs.com/Andl-Liu/p/17419450.html

相关文章

  • 学习笔记-Java8新特性-第五节-Optional类
    Optional类Optional<T>是一个容器类代表一个值存在或不存在致力于解决空指针异常问题(NPE)可以快速锁定发生NPE的位置(这东西真的好用吗?)常用方法Optional.of(Tt)创建一个Optional实例不能传入空指针,会报NPE使用Optional,报空指针了,说明就是这里的问题?......
  • 学习笔记-Java8新特性-第六节-接口中的默认方法与静态方法
    接口中的默认方法与静态方法默认方法在接口中可以使用default修饰方法,为方法提供默认实现publicinterfaceMyInterface{defaultvoidgetName(){System.out.println("DEFAULT");}}一般情况下,继承了接口的子类,可以不提供接口的实现类优先......
  • 学习笔记-Java8新特性-第七节-新时间与日期API
    新时间与日期API本地时间类LocalDateLocalTImeLocalDateTime简介人读的时间提供以ISO-8601为标准的日期和时间提供简单的日期或时间并不包含当前的时间信息也不包含与时区相关的信息示例publicvoidtest1(){LocalDateTimelocalD......
  • 学习笔记-Java8新特性-第三节-方法引用与构造器引用
    方法引用与构造器引用什么是方法引用对方法的引用若Lambda体中的内容,已经有方法实现了,我们可以使用该方法的方法引用作为替代已经有方法实现了是指,该方法的参数列表和返回值类型和lambda的一致可以将方法引用理解成Lambda表达式的另外一种表现形式语法格式对象......
  • 学习笔记-Java8新特性-第二节-Lambda表达式
    Lambda表达式Lambda表达式是什么Lambda是一个匿名函数是一段可以传递的代码是一种语法糖使用Lambda可以写出更简洁、更灵活的代码如果要使用Lambda表达式,需要函数式接口的支持Lambda的语法格式基础语法Java8中引入了一个新的操作符->称为箭头操作符或La......
  • java8
    1.编写一个方法,实现冒泡排序(由小到大),并调用该方法packagetest;publicclassccc1{publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubintx[]={1,3,5,6,7,2};paixu(x);for(inti=0;i<x.length;i++){System.out.println(x[i]);}}publicstaticvoi......
  • java8新特性,stream流简单使用
    //新建测试类@Data@NoArgsConstructor@AllArgsConstructor@EqualsAndHashCodepublicclassAuthor{//idprivateLongid;//姓名privateStringname;//年龄privateIntegerage;//简介privateStringintro;//作品privateList<Book>......
  • Java8 Stream --groupingBy 分组讲解
    本文主要讲解:Java8Stream之Collectors.groupingBy()分组示例Collectors.groupingBy()分组之常见用法功能代码:/***使用java8streamgroupingBy操作,按城市分组list*/publicvoidgroupingByCity(){Map<String,List<Employee>>map=employe......
  • java8 lamda表达式
    list分组1.多字段联合,分组list.stream().collect(Collectors.groupingBy(o->o.getSkuName()+"_"+o.getOeCode(),Collectors.toList()));2.求和计算 Integernum=list.stream().mapToInt(n->n.getNum()).sum();3.分组-排序list.stream().coll......
  • Java8中的sort与Comparator、Comparable
    基本含义在Java8中,sort()方法、Comparator接口和Comparable接口是用于对数组或集合进行排序的重要工具,其中Comparator接口适用于自定义比较规则,而Comparable接口适用于定义对象自身的比较规则。假如我们有一个实体类点击查看代码publicclassCoinUserIncome{pr......