当前位置:   article > 正文

java8 (jdk 1.8) 新特性——Stream ApI以及具体实例_jdk18stream api详解

jdk18stream api详解

java8 中,有两个最重要的改变,一个就是之前了解的Lmbda java8 (jdk 1.8) 新特性——Lambda ,还有一个就是Stream Api

1. 什么是Stream API

简单来说就是一个类库,里边有一些方法方便我们对集合数据进行操作,就好像使用 SQL 语句进行操作数据库一样

优点就是,使我们代码简洁更高效的处理数据,高效!!

一个完成的stream 流操作包含以下内容

  • 一个数据源,数据源可以是集合,数组

  • 中间链的操作 (比如 过滤, 去重,排序 等等)

  • 终止操作,产生一个结果(比如重新收集成集合)

例如:

   List<UserInfo> userInfoList =new ArrayList<>();
        userInfoList.add(new UserInfo(1,"张三",23));
        userInfoList.add(new UserInfo(2,"李四",25));
        userInfoList.add(new UserInfo(3,"王五",24));
        userInfoList.add(new UserInfo(4,"赵六",26));
        
        List<String> collect = userInfoList.stream().filter(info->info.getAge()>=25).map(UserInfo::getName).collect(Collectors.toList());
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

2. Stream 实例化

  • 通过集合创建顺序流 . stream 【常用】
 Stream<UserInfo> stream = userInfoList.stream();
  • 1
  • 通过集合创建并行流 . stream
Stream<UserInfo> parallelStream = userInfoList.parallelStream();
  • 1

这两个流的区别在初篇也有简单的介绍:java8 (jdk 1.8) 新特性 ——初步认识

  • 通过数组
 int[]  ids ={1,2,3,4,5};
        IntStream stream = Arrays.stream(ids);
  • 1
  • 2
  • Stream.of() 【常用】
Stream<Integer> ids1 = Stream.of(1,2,3,4,5);
  • 1

2. 常用操作 (重点)

Api中常用的操作有很多,这边就列举一些工作中会使用到的

数据源:

List<UserInfo> userInfoList =new ArrayList<>();
        userInfoList.add(new UserInfo(1,"张三",23));
        userInfoList.add(new UserInfo(2,"李四",25));
        userInfoList.add(new UserInfo(3,null,24));
        userInfoList.add(new UserInfo(4,"赵六",26));

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 过滤 (filter)

过滤获取名字不为空的数据

 userInfoList.stream().filter(info -> Objects.nonNull(info.getName())).forEach(System.out::println);
  • 1

在这里插入图片描述

  • 获取其中一个属性集 (map)

获取所有用户的名字集

 userInfoList.stream().map(UserInfo::getName).forEach(System.out::println);
  • 1

如果加上过滤 不为null数据

先过滤后过滤返回的结果集都是一样的

先map 后 filter

userInfoList.stream().map(UserInfo::getName).filter(Objects::nonNull).forEach(System.out::println);
  • 1

先filter后 map ,代码量明显增多,所以在操作前可以思考一下,哪一种更好一点

userInfoList.stream().filter(info -> Objects.nonNull(info.getName())).map(UserInfo::getName).forEach(System.out::println);
  • 1

在这里插入图片描述

  • 排序 (sorted)
    在这里插入图片描述
    按照年龄排序 (默认正序,从小到大)
userInfoList.stream().sorted(Comparator.comparing(UserInfo::getAge)).forEach(System.out::println);
  • 1

在这里插入图片描述
倒序(从大到小),加个reversed() 就好了

  userInfoList.stream().sorted(Comparator.comparing(UserInfo::getAge).reversed()).forEach(System.out::println);
  • 1

在这里插入图片描述

  • 计算 (reduce)

出现金额计算的时候,一般电商,库存系统 经常用得到
这边演示我就不新建一个类了(偷懒),把年龄类型直接改成 BigDecimal
注意:跟钱相关的类型都得用 BigDecimal 不要用double,精度会丢失,这可是钱,计算丢了一毛钱,财务都得奔溃

在这里插入图片描述

List<UserInfo> userInfoList =new ArrayList<>();
        userInfoList.add(new UserInfo(1,"张三",new BigDecimal("32")));
        userInfoList.add(new UserInfo(2,"李四",new BigDecimal("50")));
        userInfoList.add(new UserInfo(3,null,new BigDecimal("40")));
        userInfoList.add(new UserInfo(4,"赵六",new BigDecimal("30")));

        BigDecimal bigDecimal = userInfoList.stream().map(UserInfo::getAge).reduce(BigDecimal::add).orElse(new BigDecimal("0"));

        System.out.println(bigDecimal);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

  • 转Map 集合

将数据源转为名称,年龄map

  Map<String, Integer> collect = userInfoList.stream().collect(Collectors.toMap(UserInfo::getName, UserInfo::getAge));
  • 1

collect:就是将中间链操作后的结果进行处理 ,前面我们为了演示,都是进行forEach 进行打印输出,在工作中,都是用collect 进行收集成新的集合,或者其他数据形式

就比如: 获取所有姓名集合

List<String> collect = userInfoList.stream().map(UserInfo::getName).collect(Collectors.toList());
  • 1

有这么多种处理结果的方式

在这里插入图片描述
用的最多的就是

  1. .collect(Collectors.toList())

  2. .collect(Collectors.toMap(。。。。。))

  3. .collect(Collectors.groupingBy(。。。。。))

  • 分组 groupingBy

按照年龄分组

 List<UserInfo> userInfoList =new ArrayList<>();
        userInfoList.add(new UserInfo(1,"张三",23));
        userInfoList.add(new UserInfo(2,"李四",23));
        userInfoList.add(new UserInfo(3,null,24));
        userInfoList.add(new UserInfo(4,"赵六",26));

        Map<Integer, List<UserInfo>> collect = userInfoList.stream().collect(Collectors.groupingBy(UserInfo::getAge));

        collect.forEach((k,v) -> System.out.println("键:"+k+"......值:"+v));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述
其他API也很常用,建议随时看看Api文档,有个印象,遇到有需要使用的时候就能快速定位了

最后!! 分享java8中英文文档获取途径 ,点击,在这篇文章末

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/611970
推荐阅读
相关标签
  

闽ICP备14008679号