Jdk8 - stream相关使用笔记(1)

207 阅读1分钟

Lambda表达式

  • Lambda表达式,函数作为一个方法的参数传递到方法中。

    Lambda表达式不能修改定义在外部的局部变量,外部局部变量定义需用final修饰。 例如:外部定义一个String类型变量 final String[] rekey = {""};

  • 方法引用

    使用一对冒号:: 例如: 构造器引用 Class::new 静态方法引用 Class::static_method 特定类的任意对象的方法引用 Class::method 特定对象的方法引用 instance::method

stream 流

  • stream API 函数式编程风格。

    • 数据源 集合、数组、I/O channel,产生器generator等
    • 聚合操作 filter\map\reduce\find\match\sorted\reversed
  • 生成流

    • stream() 串行流
    • parallelStream() 并行流
  • 聚合操作

    • forEach 迭代流中的每个数据

    • map 映射每个元素对应的结果

    • filter 设置条件过滤元素

    • limit 获取指定数量的流

    • sorted 对流进行排序 (后面加上.reversed()降序)

    • parallelStream 并行流

    • Collectors 实现归约操作 例如:
      .collect(Collectors.toList())
      将流转换成集合和聚合元素,Collectors用于返回列表或字符串;
      .collect(Collectors.joining(","))
      合并字符串将“,”去除。

    • 统计 主要int double long 类型获取最大值.getMax(),最小数.getMin(),所有数和.getSum(),平均数.getAverage()

    • 分组 1、分组求和
      例如:计算某年有多少钱(因为money类型为BigDecimal类型,所以需要映射)

    Map<String,Optional<BigDecimal>> item = list.stream() .collect(Collectors.groupingBy(List::getYear,Collectors.mapping(List::getMoney,  Collectors.reducing(BigDecimal::add))));
    

    2、 只是根据某个字段进行分组:

    Map<String,List<ListDto>> monthMap = list.stream().collect(Collectors.groupingBy(ListDto::getMonth));