设为首页 加入收藏

TOP

java8 (jdk 1.8) 新特性——Stream ApI (一)
2023-07-25 21:34:04 】 浏览:43
Tags:java8 jdk 1.8 Stream ApI

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

1. 什么是Stream API 

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

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

官方java8 Api中文文档 在公众号内 回复关键字 【文档】 获取

一个完成的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());

 

 

 

2.  Stream 实例化

  • 通过集合创建顺序流    . stream  【常用

  Stream<UserInfo> stream = userInfoList.stream();
  • 通过集合创建并行流    . stream

Stream<UserInfo> parallelStream = userInfoList.parallelStream();

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

 

  • 通过数组 

  int[]  ids ={1,2,3,4,5};
        IntStream stream = Arrays.stream(ids);

 

  •    Stream.of()   【常用】
 Stream<Integer> ids1 = Stream.of(1,2,3,4,5);

 

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));
  •   过滤 (filter) 

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

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

  

 

 

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

  获取所有用户的名字集

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

 

如果加上过滤 不为null数据

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

先map 后 filter

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

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

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

  

 

 

 

  • 排序 (sorted)

 

 

 

按照年龄排序 (默认正序,从小到大)

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

 

 

 倒序(从大到小),加个reversed() 就好了

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

  

 

 

 

  • 计算 (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,&quo
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇day01-SpringCloud&Spring Cloud .. 下一篇每日算法之二叉树中和为某一值的..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目