Java 中 Stream 流的使用方法

目录

一、Stream 的概念

二、Stream 的特点

三、Stream 的使用步骤

1、Stream 的创建

        1.1、通过Collection对象的stream()或parallelStream()方法

        1.1.1、stream() 和 parallelStream() 两个方法的区别

        1.2、通过 Arrays 工具类的 stream() 方法

       1.3、通过Stream接口的of()、iterate()、generate()方法。

        1.4、通过IntStream、LongStream、DoubleStream接口中的of、

                range、rangeClosed方法。

2、Stream 的中间操作

        2.1、filter() 过滤操作

        2.2、limit() 截取操作

        2.3、skip() 元素跳过操作

        2.4、distinct() 去重操作

        2.5、sorted() 排序操作

        2.6、map() 对流中元素进行操作

3、Stream 的终止操作

        3.1、min() 和 max() 按照传入的函数获取流中最大最小值

        3.2、count() 获取流中元素个数

        3.3、reduce() 归约操作

        3.4、collect() 将流转换为集合的形式


一、Stream 的概念

流( Stream )与集合类似,但集合中保存的是数据,而 Stream 中保存对集合或数组数据的操作。

二、Stream 的特点

  • Stream 自己不会存储元素。
  • Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream
  • 当一个流执行完终止操作后将不能再被使用。
  • Stream 操作是延迟执行的,会等到需要结果的时候才执行。

三、Stream 的使用步骤

1、Stream 的创建

新建一个流。

        1.1、通过Collection对象的stream()或parallelStream()方法

        //通过Collection对象的stream()或parallelStream()方法。List<String> stringList=new ArrayList<>();Stream<String> stream1 = stringList.stream();Stream<String> stream2 = stringList.parallelStream();
        1.1.1、stream() 和 parallelStream() 两个方法的区别

                stream() 方法:返回一个顺序流,即元素是按顺序处理的。这意味着对于大多数操作,它们将按照集合中元素的顺序依次执行。适合于处理顺序操作,并且在单线程环境下能够提供良好的性能。

               parallelStream() 方法:返回一个并行流,即元素将会在多个线程上同时处理。这意味着对于一些操作,它们可以并行执行,提高处理速度。适合于对大量数据进行并行处理,可以充分利用多核处理器的性能。

        1.2、通过 Arrays 工具类的 stream() 方法

        // 通过Arrays工具类的stream()方法int[] arr=new int[10];IntStream stream = Arrays.stream(arr);

       1.3、通过Stream接口的of()、iterate()、generate()方法。

        // of() 创建包含指定元素的流Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5, 6);/*iterate() 生成一个无限长度的流,其元素是通过对初始值重复应用指定的函数生成的0是初始值,后一个参数为一个函数,初始值为参数*/Stream<Integer> iterate = Stream.iterate(0, n -> n + 2);/*用于生成一个无限长度的流,其中的每个元素是通过调用提供的 Supplier 函数来生成的这个流中包含无限个 hello 字符串*/Stream<String> generate = Stream.generate(() -> "hello");

        1.4、通过IntStream、LongStream、DoubleStream接口中的of、

                range、rangeClosed方法。

        // of() 创建包含指定元素的流IntStream intStream = IntStream.of(1, 2, 3, 4, 5);// range() 创建指定范围内的所有元素的流(不包含 5)左闭右开IntStream range = IntStream.range(1, 5);// range() 创建指定范围内的所有元素的流(包含 5)IntStream closed = IntStream.rangeClosed(1, 5);

2、Stream 的中间操作

在一个或多个步骤中,将初始 Stream 转化到另一个 Stream 的中间操作。

        2.1、filter() 过滤操作

        // filter 过滤操作,参数为一个函数,返回值为 boolean 类型Stream<String> stringStream =Stream.of("111", "22", "33333", "4444", "5555555","111");// 获取流中字符串长度小于3的字符串 结果为 22stringStream.filter(o -> o.length() < 3).forEach(System.out::println);

        2.2、limit() 截取操作

        // 获取流中的前两条数据stringStream.limit(2).forEach(System.out::println);

        2.3、skip() 元素跳过操作

        // 获取流中第3、4条数据,相当于一个分页操作stringStream.skip(2).limit(2).forEach(System.out::println);

        2.4、distinct() 去重操作

        // 去除流中的重复元素stringStream.distinct().forEach(System.out::println);

        2.5、sorted() 排序操作

        // 对流中的元素按照字符串长度降序排序stringStream.sorted((o1, o2) -> o2.length() - o1.length())

        2.6、map() 对流中元素进行操作

        // 将流中的元素转换为整形,去重并排序(按照默认的排序规则)stringStream.map(o -> Integer.parseInt(o)).distinct().sorted();// 最简写法,:: 的用法:前面是调用方法的类,后面是要调用的该类的方法// 整体含义是调用 Integer 类的 parseInt 方法处理流中的每个元素stringStream.map(Integer::parseInt).distinct().sorted();

3、Stream 的终止操作

使用一个终止操作来产生一个结果(新的对象)。该操作会强制之前的延迟操作立即执行,在此之后,该 Stream 就不能使用了

        3.1、min() 和 max() 按照传入的函数获取流中最大最小值

         对于optional 对象的基本使用可以参考Java 中 Optional 类的使用-CSDN博客       

// 获取流中的最小和最大数,返回值为一个 Optional 对象 
Optional<Integer> min = 
stringStream.map(Integer::parseInt).distinct().min((o1, o2) -> o1 - o2);
Optional<Integer> max = 
stringStream.map(Integer::parseInt).distinct().max((o1, o2) -> o1 - o2);

        3.2、count() 获取流中元素个数

        // 获取流中元素的个数long count = stringStream.distinct().count();

        3.3、reduce() 归约操作

/*将流中的元素转为整形并 +1,最后进行求和
o1 为第一个参数,o2 为流中的元素*/
stringStream.map(o -> Integer.parseInt(o) + 1).reduce(0, (o1, o2) -> o2);// 获取流中最大和最小的元素
Optional<Integer> min = stringStream.map(Integer::parseInt).reduce(Integer::max);
Optional<Integer> max = stringStream.map(Integer::parseInt).reduce(Integer::min);

        3.4、collect() 将流转换为集合的形式

@Data
@AllArgsConstructor
@NoArgsConstructor
class Student {private Integer Id;private String name;private Integer age;private String hobby;
}
Student s1 = new Student(1, "zs", 20, "唱");
Student s2 = new Student(2, "ls", 21, "唱");
Student s3 = new Student(3, "rose", 22, "跳");
Student s4 = new Student(4, "jack", 20, "rap");
Student s5 = new Student(5, "cxk", 21, "篮球");
// 将流转换为一个 List 集合
List<Student> students = Stream.of(s1, s2, s3, s4, s5).collect(Collectors.toList());
/*将流转换为 map 集合,其中 id 为 key,流中的 Student 元素为 value
toMap中的代码解析:
TradeReportInfo::getTradeId 作为键,o -> o 作为值的生成器函数
(o1, o2) -> o1是一个合并函数,当存在多个具有相同键的对象时,这个函数决定处理这些值*/
Map<Integer, Student> studentMap = Stream.
of(s1, s2, s3,s4,s5).collect(Collectors.toMap(Student::getId, o -> o, (o1, o2) -> o1));/*将流中的元素根据年龄分组,转换为了一个 map 集合,
其中年龄为 key,value 为该年龄对应的 Student 元素*/
Map<Integer, List<Student>> listMap = Stream.
of(s1, s2, s3, s4, s5).collect(Collectors.groupingBy(Student::getAge));

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

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

相关文章

Local Binary Convolutional Neural Networks (LBCNN)

论文&#xff1a;https://arxiv.org/abs/1608.06049 代码&#xff1a;GitHub - juefeix/lbcnn.torch: Torch implementation of CVPR17 - Local Binary Convolutional Neural Networks http://xujuefei.com/lbcnn.html 摘要&#xff1a; 我们提出了局部二值卷积(LBC)&#x…

在uni-app项目中,如何进行性能优化

在uni-app项目中&#xff0c;可以通过以下几种方式进行性能优化&#xff1a; 减少请求次数&#xff1a;合并请求&#xff0c;将多个请求合并成一个请求&#xff0c;减少网络请求次数&#xff0c;提高性能。优化图片加载&#xff1a;使用合适的图片格式&#xff0c;并进行压缩和…

python实现对终端信息的清屏或者部分行清除

有些时候我们看到部分工具能够在给出提示项或者下载库信息的时候&#xff0c;有点类似滚动的效果&#xff0c;其实就是清除了一些行的字符信息。虽然我总结的不是很全&#xff0c;但是就我知道的方式而言&#xff0c;总结了下面的一些方法实现工具&#xff0c;仅供参考&#xf…

【效率工具】利用python进行本地知识库(PDF和WORK文件内容)的批量模糊搜索

目录 前言 一、为什么要进行本地文档的批量搜索? 二、如何去做呢?

【ScienceAI Weekly】DeepMind最新研究再登Nature;我国首个自研地球系统模型开源;谷歌推出医疗保健模型

AI for Science 的新成果、新动态、新视角抢先看—— * DeepMind 最新研究 FunSearch 登 Nature * 谷歌推出医疗保健行业模型 MedLM * 晶泰科技冲刺港交所&#xff0c;AI机器人赋能 AI for Science * GHDDI 与微软研究院科学智能中心达成合作 * 用于地震学处理分析的 AI 工…

服务器的出口IP地址查询

在服务器中&#xff0c;IP地址是至关重要的。但是很多情况下我们看见的IP地址多数为内网IP。比如192.168.X.X。这些都是内网IP&#xff0c;也就是脱离了内网环境我们就无法再访问这些IP地址。 工作中&#xff0c;我们常常会接触到IP白名单&#xff1b;使用云服务器时需要配置安…

【华为机试】2023年真题B卷(python)-分月饼

一、题目 题目描述&#xff1a; 中秋节公司分月饼&#xff0c;m个员工&#xff0c;买了n个月饼&#xff0c;m<n&#xff0c;每个员工至少分1个月饼&#xff0c;但可以分多个&#xff0c;单人份到最多月饼的个数为Max1&#xff0c;单人分到第二多月饼的个数是Max2&#xff0c…

python(上半部分)

第一部分 1、input()语句默认结果是字符串 2、type()可以判断变量的类型 3、input()输出语句 &#xff08;默认为字符串类型&#xff09; 4、命名规则&#xff1a;中文、英文、数字、_&#xff0c;数字不可开头&#xff0c;大小写敏感。 5、 %s&#xff1a;将内容转换成…

常用css属性

所有 CSS 背景属性 属性描述background在一条声明中设置所有背景属性的简写属性。background-attachment设置背景图像是固定的还是与页面的其余部分一起滚动。background-clip规定背景的绘制区域。background-color设置元素的背景色。background-image设置元素的背景图像。bac…

Java并发(二十一)----wait notify介绍

1、小故事 - 为什么需要 wait 由于条件不满足&#xff08;没烟干不了活啊&#xff0c;等小M把烟送过来&#xff09;&#xff0c;小南不能继续进行计算 但小南如果一直占用着锁&#xff0c;其它人就得一直阻塞&#xff0c;效率太低 于是老王单开了一间休息室&#xff08;调…

refusing to merge unrelated histories如何解决git冲突

当使用git merge命令合并分支时&#xff0c;如果Git检测到分支之间存在不相关的提交历史记录&#xff0c;它会给出refusing to merge unrelated histories错误。这种情况下&#xff0c;可以通过以下几种方法解决冲突。 强制合并&#xff1a;使用git merge命令时&#xff0c;加…

如何在uni-app项目中进行数据持久化

在uni-app项目中进行数据持久化有多种方法&#xff0c;以下是几种常用的方式&#xff1a; 使用uni-app的本地存储API&#xff08;uni.setStorageSync和uni.getStorageSync&#xff09;进行数据存取。例如&#xff1a; // 存储数据 uni.setStorageSync(key, value); // 获取数…

vue场景 无分页列表条件过滤,子组件多选来自父组件的列表

日常开发中&#xff0c;经常会遇到下面场景&#xff1a; 页面加载一个无分页列表&#xff0c;同时工具栏设置多个条件可对列表过滤的场景(典型的就是关键字模糊查询)父组件传给子组件列表&#xff0c;子组件中需要多选列表多选&#xff0c;选择结果返回父组件 1 无分页列表过…

鸿蒙 - arkTs:网络请求封装和使用

1. module.json5文件配置网络请求 {"module": {"requestPermissions": [{"name": "ohos.permission.INTERNET"}]} } 2. 在pages同级创建一个文件夹&#xff0c;起名为api 3. api文件夹下创建index.ts文件&#xff0c;文件内容&…

前端---css 选择器

1. css 选择器的定义 css 选择器是用来选择标签的&#xff0c;选出来以后给标签加样式。 2. css 选择器的种类 标签选择器类选择器层级选择器(后代选择器)id选择器组选择器伪类选择器 3. 标签选择器 根据标签来选择标签&#xff0c;以标签开头&#xff0c;此种选择器影响范…

支持向量机(Support Vector Machine,SVM)算法 简介

支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;算法&#xff0c;简称SVM 算法。 在保证了分类正确性的同时&#xff0c;还尽可能让两个样本的类别更容易区分。简单来说就是&#xff0c;不仅做对了&#xff0c;还保证了质量。 当样本数据是线性可分…

行业首台7英寸彩屏,掌阅iReader Color 7 发布

12月22日消息&#xff0c;掌阅iReader 继2021年发布 C6 Pro 后&#xff0c;时隔2年再次推出彩屏系列新产品 Color 7&#xff0c;该产品为彩色电子纸智能阅读本&#xff0c;采用 Kaleido3 新一代彩色电子纸技术&#xff0c;黑白像素密度为 300PPI &#xff0c;彩色像素密度为 15…

并发程序设计--D1进程的创建和回收

进程和程序内容区别 进程包含的内容&#xff1a; BSS段&#xff1a;存放程序中未初始化的全局变量 数据段&#xff1a;已初始化的全局变量 代码段&#xff1a;程序执行代码 堆&#xff08;heap&#xff09;&#xff1a;malloc等函数分配内存 栈(stack)&#xff1a;局部变量…

让学习成为一种生活方式:数字化助力终身学习

12月以来,“让学习成为一种生活方法”全民终身学习活动在北京、安徽、湖北、湖南、云南等地密集启动,而依托数字化赋能终身学习成为共同关键词。 近年来,随着教育现代化体系的不断深入推进,数字化转型成为建设高质量终身学习体系的重要“推动力”,数字技术与大数据的应用汇聚了…

2023新能源汽车,吵得越凶,卖得越多

作者 | 辰纹 来源 | 洞见新研社 2023年的汽车行业很残酷&#xff0c;合资大败退&#xff0c;市场份额被自主品牌大幅渗透&#xff0c;三菱退出中国市场&#xff0c;成为真实写照。 新能源车企&#xff0c;威马领头&#xff0c;天际、自游家NIUTRON、恒驰、爱驰、雷丁等造车新…