java8 (jdk 1.8) 新特性——Stream ApI

news2024/11/24 3:41:58

在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,"赵六",new BigDecimal("30")));

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

        System.out.println(bigDecimal);

在这里插入图片描述

  • 转Map 集合
    将数据源转为名称,年龄map
  Map<String, Integer> collect = userInfoList.stream().collect(Collectors.toMap(UserInfo::getName, UserInfo::getAge));

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

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

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

有这么多种处理结果的方式
在这里插入图片描述
用的最多的就是

  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));

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

最后!! 记得公众号内回复 关键字【文档】 获取 java8 api 中英文文档,双倍快乐

在这里插入图片描述

在这里插入图片描述
java8 (jdk 1.8) 新特性—— 方法引用+构造器引用

java8 (jdk 1.8) 新特性——Lambda

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/25712.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows cmd 命令及Linux 环境下导入导入mysql 数据库

文章目录一、背景二、Windows cmd 导入导出mysql 数据库1.导出数据库三种方式&#xff08;导出数据库时不需要连接数据库&#xff09;2. 操作步骤2.导入数据库三、linux 环境下导入导出数据库一、背景 最近在本机上安装了一个WMware 虚拟机&#xff0c;需要从本机&#xff08;…

从三层架构说起,谈谈对历史项目的小改造

项目背景说明 最近接手一个 “老” 项目的需求修改&#xff0c;项目整体基于 .net core 3.1 平台&#xff0c;以传统的三层架构为基础构建。了解需求后&#xff0c;逐步对原有项目框架进行大概的了解&#xff0c;主要是熟悉一些框架的开发规范&#xff0c;基本工具类库的使用&…

寒亭5.8万亩盐碱稻 国稻种芯·中国水稻节:山东潍坊插秧期

寒亭5.8万亩盐碱稻 国稻种芯中国水稻节&#xff1a;山东潍坊插秧期 新京报讯&#xff08;记者赵利新&#xff09;新闻中国采编网 中国新闻采编网 谋定研究中国智库网 中国农民丰收节国际贸易促进会 国稻种芯中国水稻节 中国三农智库网-功能性农业农业大健康大会报道&#xff…

MMRotate 全面升级,新增 BoxType 设计

引言&#xff1a;大大降低水平框检测器改旋转框检测器的难度 MMRotate 是一个基于 PyTorch 和 MMDetection 的开源旋转框目标检测工具箱。它将目标检测从水平框扩展到旋转框&#xff0c;为场景文字、遥感影像、自动驾驶等领域的应用打下了基础&#xff0c;为学术界和产业界提供…

瞄准镜-第12届蓝桥杯Scratch选拔赛真题精选

[导读]&#xff1a;超平老师计划推出Scratch蓝桥杯真题解析100讲&#xff0c;这是超平老师解读Scratch蓝桥真题系列的第82讲。 蓝桥杯选拔赛每一届都要举行4~5次&#xff0c;和省赛、国赛相比&#xff0c;题目要简单不少&#xff0c;再加上篇幅有限&#xff0c;因此我精挑细选…

数据结构——单链表

一.简介 上一篇文章&#xff0c;我们介绍了线性表中的顺序表。 而顺序表拥有一些缺陷 1.空间不够时需要增容&#xff0c;增容需要付出代价 2.为避免重复扩容&#xff0c;我们进行指数扩容&#xff0c;可能会造成空间浪费 3.顺序表从开始位置连续存储&#xff0c;插入删除数…

卡特尔世界杯来了,只喝精酿啤酒不玩望京扑克,其实也是一种缺失

北京时间2022年11月20日&#xff0c;卡特尔世界杯正式拉开了序幕&#xff0c;全球都进入了世界杯时间。世界杯的开幕&#xff0c;最高兴的还是球迷朋友&#xff0c;大家可以欢聚一堂&#xff0c;喝着精酿啤酒看着足球&#xff0c;那滋味别提多舒服了。 世界杯对于广大球迷来说&…

表的增删查改

目录 插入数据 基本查询 更新数据 清空数据 聚合函数 group by子句 内置函数 基本查询练习 多表查询 子查询 合并查询 表的内外连接 插入数据 单行—全列插入 如下图&#xff0c;全列插入可以省略要在哪些列插入&#xff01; 多行—指定列插入 如下图&#xff0…

安装 Red Hat Enterprise Linux 9.1 虚拟机

目录1. 官方下载链接与新闻2. 安装提示3. 系统安装步骤&#xff08;1&#xff09;进入系统引导界面&#xff08;2&#xff09;进入【系统语言选择】界面&#xff08;3&#xff09;进入【安装信息摘要】界面① 设置【root密码】② 设置【安装目的地】&#xff08;4&#xff09;进…

【python】使用python将多个视频合并、延长视频的时间

今天做知识分享的时候&#xff0c;最后保存的视频时长是58分钟&#xff0c;那么如何改变视频的时长&#xff0c;将视频时长改为一个小时呢&#xff1f; 下面提供3个方案&#xff1a; 方案1&#xff0c;重新录&#xff0c;很显然&#xff0c;不合理&#xff1b; 方案2&#xf…

蓝屏page_fault_in_nonpaged_area的解决办法

用户在操作电脑的过程中&#xff0c;难免会遇到蓝屏问题&#xff0c;最近就有用户遇到电脑蓝屏重启无限循环&#xff0c;提示代码page_fault_in_nonpaged_area&#xff0c;这要如何解决呢&#xff1f;下面就来看看详细的解决办法。 page_fault_in_nonpaged_area蓝屏代码解决方法…

【MySQL篇】第一篇——数据库基础

目录 什么是数据库 主流数据库 基本使用 MySQL安装 连接服务器 服务器管理 服务器&#xff0c;数据库&#xff0c;表关系 使用案例 创建数据库 使用数据库 创建数据库表 表中插入数据 查询表中的数据 数据逻辑存储 MySQL架构原理 MySQL整体逻辑架构 MySQL逻辑…

Eureka架构篇 - 服务发现

前言 从客户端与服务端两个角度概述一下Eureka服务发现的原理&#xff0c;如下&#xff1a; 客户端 依赖自动装配机制&#xff0c;客户端启动时就会从Eureka服务端全量获取服务实例的注册信息并缓存到本地。之后每隔30秒向Eureka服务端发起增量获取的请求&#xff0c;如果增…

云原生周刊 | 波音公司允许员工给开源项目做贡献

如果你要问谁对开源项目的贡献最小&#xff0c;那一定是保密等级很高的国防工业机构&#xff0c;但这个魔咒最近被波音公司给打破了。在最近的一次 Linux 基金会成员峰会 keynote 演讲中&#xff0c;波音公司提到他们会在 2022 年成立一个开源办公室&#xff0c;并且从即日起&a…

m基于MATLAB-GUI的GPS数据经纬度高度解析与kalman分析软件设计

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 经度纬度和高度来自GPS信号的中的GPGGA的数据。所以提取这三个信息主要是对GPGGA中的数据进行整理。GPGGA的数据格式如下所示&#xff1a; GPGGA是GPS数据输出格式语句&#xff0c;意思是…

9问502

一、502意味着什么 502 Bad Gateway是指错误网关&#xff0c;无效网关&#xff1b;在互联网中表示一种网络错误。表现在WEB浏览器中给出的页面反馈。它通常并不意味着上游服务器已关闭&#xff08;无响应网关/代理&#xff09; &#xff0c;而是上游服务器和网关/代理使用不一…

latex 模板使用技巧——参考文献篇

参考文献说明&#xff1a; 一、 常用参考文献类型 1、会议 &#xff08;INPROCEEDINGS&#xff09; 示例&#xff1a; INPROCEEDINGS{rcnn,title{Rich feature hierarchies for accurate object detection and semantic segmentation},author{Girshick, Ross and Donahue, J…

骨传导耳机是利用什么原理听歌?什么骨传导耳机好用

这几年来骨传导耳机的火热程度不言而喻&#xff0c;很多运动人士手上必有一款骨传导耳机&#xff0c;也随着骨传导耳机的兴起&#xff0c;越来越多小伙伴都加入了运动当中。当然&#xff0c;也有很多小伙伴是不知道骨传导耳机的&#xff0c;更不知道骨传导耳机有什么作用&#…

KESION(.NET版)安装方法

若是windows2008系统,访问xxxxxx.com - xxx sex videos free hd porn 资源和信息。 安装界面没有样式加载,请先编辑web.config 去掉 <defaultDocument> <files> <clear /> <add value"index.aspx" /> </files> </defaultDocume…

Android App开发手机阅读中PDF文件渲染器的讲解及使用(附源码 简单易懂)

需要源码和图片集请点赞关注收藏后评论区留言~~~ 一、PDF文件渲染器 Android集成了PDF的渲染操作&#xff0c;从很大程度上方便了开发者&#xff0c;这个PDF文件渲染器便是PdfRenderer。渲染器允许从存储卡读取PDF文件 打开PDF文件只是第一步&#xff0c;接下来使用PdfRender…