系统讲解java中list.stream()的用法

在Java 8及以后的版本中,引入了新的Stream API,这个API提供了一组新的操作方法,可以便捷

地对Java集合进行过滤、映射、排序、分组等操作。

在Stream API中主要分中间操作,和终止操作

中间操作是对流进行处理但不产生最终结果的操作。中间操作可以被连续地串联起来形成一个操作流水线,最终由终止操作来触发流的执行。中间操作是懒执行的,只有在触发终止操作时,中间操作才会被执行,中间操作函数还有对应的子中间操作函数可调用

简单一句话就是Stream在中间操作流转变化,所以中间操作方法都是返回流

终止操作是用于触发流流水线执行并产生最终结果的操作。它会产生一个非流的结果,如集合、数组、单个元素或者副作用。终止操作是惰性求值的,也就是说,只有在调用终止操作时,中间操作才会被执行。这种设计可以实现更高效的数据处理,避免不必要的计算。

简单一句话就是Stream在终止操作决定返回什么值

常用的中间操作:

  1. filter:根据指定的条件对流中的元素进行过滤根据谓词(Predicate)对流中的元素进行筛选。
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);List<Integer> filteredNumbers = numbers.stream().filter(n -> n % 2 == 0) // 筛选出偶数.collect(Collectors.toList());
  2. map:对流中的每个元素应用一个函数,将其映射为另一个元素。方法需要传函数式接口 Function 类型的参数,该函数接受一个输入元素,并返回一个经过映射处理后的输出元素流。
  3. flatMap:将流中的每个元素映射为一个流,然后将这些流扁平化为一个新的流。方法需要传递一个 Function 类型的参数,该函数接受一个元素作为输入,并返回一个包含多个元素的流
    List<String> words = Arrays.asList("Hello", "World", "Java");List<Character> letters = words.stream().flatMap(word -> word.chars().mapToObj(c -> (char) c)).collect(Collectors.toList());System.out.println(letters);
    //输出[H, e, l, l, o, W, o, r, l, d, J, a, v, a]
  4. distinct:去除流中重复的元素。
  5. sorted:对流中的元素进行排序。参数Comparator返回流
    sorted(Comparator.comparing(类型名称::类型属性))//默认数字排序和按照字母顺序排序
  6. peek:对流中的每个元素执行一些操作,接受一个Consumer参数,如打印或调试。注意peek方法不能用于修改元素
  7. limit:限制从流中获取的元素数量。
  8. skip:跳过流中的前几个元素。
  9. takeWhile:从流中获取满足指定条件的元素,遇到第一个不满足条件的元素就停止获取。根据谓词(Predicate)对流中的元素进行筛选注意Java9开始使用
  10. dropWhile:跳过从流中满足指定条件的元素,遇到第一个不满足条件的元素开始获取。根据谓词(Predicate)对流中的元素进行筛选注意Java9开始使用

常用的终止操作:

  1. collect:将流中的元素收集到一个集合或者单个对象中。
  2. forEach:对流中的每个元素执行指定的操作。无返回值只改变当前集合
  3. reduce:根据某个规约操作(如求和、求最大值等)来合并流中的元素,最终将流归约为一个值或一个 Optional 对象。例子:使用reduce操作传入初始值0和一个Lambda表达式作为累加器函数。Lambda表达式接收两个参数a和b,相加后返回结果。reduce操作从流的第一个元素开始,将该元素作为初始值,然后针对列表中的每个元素依次执行累加器函数。最终得到所有元素的累加和(这里的计算相当于调用sum函数)
    int sum = numbers.stream().reduce(0, (a, b) -> a + b);
    
  4. count:返回流中元素的数量。返回long
  5.  max/min:返回流中的最大值/最小值。参数Comparator返回Optional对象
    List<Integer> numbers = Arrays.asList(1, 10, 5, 8, 3);Optional<Integer> max = numbers.stream()//如果流为空,则返回一个空的 Optional 对象.max(Comparator.naturalOrder());//Comparator.naturalOrder() 比较器,该比较器使用元素的自然顺序进行比较。// 输出 10
    max.ifPresent(System.out::println);//ifPresent 方法判断结果是否存在,如果存在则打印最大值。
  6. anyMatch/allMatch/noneMatch:判断流中的元素是否满足某个条件。参数谓词(Predicate)返回布尔值
  7. findFirst/findAny:找到流中的第一个元素或者任意元素。方法返回一个 Optional 对象(findAny是随机取)
  8. toArray:将流中的元素转换为数组。
  9. sum:求和返回对应中间函数调用的数据类型  如
    List<Student> students = Arrays.asList(new Student("Tom", 80),new Student("Jerry", 90),new Student("Mickey", 70)
    );int sum = students.stream().mapToInt(Student::getScore)//这里和map传的FUNCTION类型参数.sum();

理解这些操作还需要理解几个名词

1.谓词(Predicate): 谓词是一个函数接口,它接受一个参数并返回一个布尔值一般用于filter,takeWhiledropWhile

2.Consumer : Consumer 是一个函数式接口,在 Java 中属于 java.util.function 包下。它定义了一个具有一个输入参数的操作,并且没有返回值一般用于forEach与peek

Consumer 接口有一个抽象方法 accept(T t),该方法接受一个输入参数,并且对该参数进行处理操作。

3.Comparator:Comparator是Java中用于比较对象的接口。它定义了比较两个对象的规则,用于在排序、查找等操作中确定对象的顺序。一般用于sorted ,max,min

Comparator接口有一个用于比较的方法:compare(T obj1, T obj2)。该方法接受两个参数,并返回一个整数值,表示比较结果的大小关系。

4.函数式接口 Function 类型的参数,该接口接受一个输入元素,并返回指定类型的元素流。

一般用于map, flatMap 等map相关函数

5.归约(reduce)操作 其中最常用的形式接受一个二元操作符(BinaryOperator)作为参数,来完成归约操作,这个下篇文章写

 

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

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

相关文章

时间序列预测中的数据分析->周期性、相关性、滞后性、趋势性、离群值等特性的分析方法

本文介绍 本篇文章给大家介绍的是&#xff0c;当我们在进行有关时间序列相关的工作或者实验时&#xff0c;需要对数据进行的一些数据分析操作(包括周期性、相关性、滞后性、趋势性、离群值等等分析)的方法。在本篇文章中会以实战的形式进行讲解&#xff0c;同时提供运行代码和…

clickhouse安装与远程访问

安装&#xff08;本文以ubuntu系统为例&#xff09; 单节点设置​ 为了延迟演示分布式环境的复杂性&#xff0c;我们将首先在单个服务器或虚拟机上部署ClickHouse。ClickHouse通常是从deb或rpm包安装&#xff0c;但对于不支持它们的操作系统也有其他方法。 例如&#xff0c;…

深度/统信系统 dde-dconfig命令的用法

关于DDE组件 DDE&#xff08;Deepin Desktop Environment&#xff09;是深度/统信 公司开发的一套桌面环境&#xff0c;包含很多组件。 dde-dconfig命令用于配置这些组件的一些参数。 其图形配置工具名称&#xff1a;dde-dconfig-editor 可使用命令安装&#xff1a; sudo …

在Windows 10上安装单机版的hadoop-3.3.5

1、Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以不需要了解分布式底层细节的情况下&#xff0c;开发分布式程序。充分利用集群进行高速运算和存储。 2、下载Hadoop&#xff0c;我们在清华大学的镜像站下载 Index of /apache/hadoop/core/hadoop-3.3.6 (t…

CAN2无法通信问题

文章目录 一、CAN2通信要注意的问题二、CAN中断无法进入的问题 一、CAN2通信要注意的问题 从这张图片不难看出can1为主机&#xff0c;can2为从机。因此can2的启动前提是已经启动了can1. can通讯can2是基于can1的 使用can2之前必须初始化can1 单独使用CAN2时一定要同时打开CAN1和…

52基于MATLAB的希尔伯特Hilbert变换求包络谱

基于MATLAB的希尔伯特Hilbert变换求包络谱&#xff0c;对原始信号进行初步滤波&#xff0c;之后进行包络谱分析。可替换自己的数据进行优化。程序已调通&#xff0c;可直接运行。 52的尔伯特Hilbert变换包络谱 (xiaohongshu.com)

STM32开发(二十八)STM32F103 高级外设 —— 触摸校准

文章目录 一、基础知识点二、开发环境1、硬件开发准备2、软件开发准备三、STM32CubeMX相关配置四、Vscode代码讲解五、结果演示一、基础知识点 问题一、为什么要进行触摸校准? 假如LCD屏幕尺寸是240x320,触摸膜物理尺寸和LCD屏幕是一样的,但是触摸的ADC值长和宽一样的是0-4…

股票融资科普:融资融券对散户好不好?为何?

股票融资融券是一种常见的股票交易方式&#xff0c;它可以让投资者通过借入资金来购买股票&#xff0c;或借入股票来卖空股票&#xff0c;从而获得投资收益。但是&#xff0c;对于散户来说&#xff0c;融资融券到底是好是坏呢&#xff1f;下面将从几个方面来解析。 首先&#x…

分布式软件开发的相关技术

分布式计算和系统架构&#xff1a;理解分布式计算的基本概念、原理和架构模式&#xff0c;如客户端-服务器架构、微服务架构、大规模集群等。网络通信与协议&#xff1a;掌握网络通信的基本知识和常用的网络协议&#xff0c;如TCP/IP、HTTP、RESTful API等。分布式存储系统&…

Elastic Observability 8.11:ES|QL、APM 中的通用分析和增强的 SLOs

作者&#xff1a;Tom Grabowski, Katrin Freihofner, Israel Ogbole Elastic Observability 8.11 引入了 ES|QL for Observability&#xff08;技术预览版&#xff09;、Universal ProfilingTM 和 Elastic APM 集成&#xff0c;以及针对 Elastic Observability 的新 SLO &#…

使用c++17std库varaint替代varaint开源库报错处理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;…

相机滤镜软件Nevercenter CameraBag Photo mac中文版特点介绍

Nevercenter CameraBag Photo mac是一款相机和滤镜应用程序&#xff0c;它提供了一系列先进的滤镜、调整工具和预设&#xff0c;可以帮助用户快速地优化和编辑照片。 Nevercenter CameraBag Photo mac软件特点介绍 1. 滤镜&#xff1a;Nevercenter CameraBag Photo提供了超过2…

立体库堆垛机取货动作控制程序功能

取货动作功能块 为左出货台有货 DB11.DBX0.0 左出货台车就位 DB11.DBX0.2 右出货台车就位 DB11.DBX1.2 为右出货台有货 DB11.DBX1.0 左出货台车就位 DB11.DBX0.2 右出货台车就位 DB11.DBX1.2 T20上升保护时间

【畅所欲言】GPT时代:创作助手,助力职业发展

引言 随着人工智能技术的迅速发展&#xff0c;ChatGPT已经成为全球范围内的热门话题。各大平台纷纷推出自己的GPT产品&#xff0c;如百度上线了【文心一言】&#xff0c;CSDN推出了【C知道】&#xff0c;甚至在创作时&#xff0c;我们也可以使用【AI助手】来辅助创作。然而&…

【C++干货铺】初识模板

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 泛型编程 函数模板 函数模板格式 函数模板原理 函数模板实例化 模板参数的匹配原则 类模板 定义格式 类模板的实例化 泛型编程 什么是泛型&#xff1f; …

【springboot】spring的Aop结合Redis实现对短信接口的限流

前言 场景: 为了限制短信验证码接口的访问次数&#xff0c;防止被刷&#xff0c;结合Aop和redis根据用户ip对用户限流 1.准备工作 首先我们创建一个 Spring Boot 工程&#xff0c;引入 Web 和 Redis 依赖&#xff0c;同时考虑到接口限流一般是通过注解来标记&#xff0c;而注解…

麒麟v10 安装jenkins

1.想安装哪个版本&#xff1f; https://pkg.jenkins.io/redhat-stable/ 我们查看我们想要哪个版本&#xff1a; 4年前安装的是 Jenkins2.279 版本 现在在docker 上安装的是Version 2.425 版本 2.碰到到的问题 1.安装老版本的Jenkins&#xff0c;会出现安装的插件不兼容&…

【前段基础入门之】=>CSS3新特性 文本多列 布局

概述&#xff1a; 作用&#xff1a;专门用于实现类似于报纸的布局。属于是一行文本多列布局 属性/值描述column-count 指定列数&#xff0c;值是数字。column-width指定列宽&#xff0c;值是长度单位columns同时指定列宽和列数&#xff0c;复合属性&#xff1b;值没有数量和顺序…

python向word中添加表格

1、表格插入 方法一&#xff1a;直接创建表添加 #导入库 from docx import Document #创建文档对象 document Document()#创建5行7列表格 table document.add_table(rows5, cols7)#修改第2行第3列单元格的内容为中国 table.cell(1,2).text中国 #修改第3行第4列单元格的内容…

Python基础教程之七:Python字符串操作

在Python中&#xff0c;string文字是&#xff1a; 代表Unicode字符的字节数组用单引号或双引号引起来无限长度 字符串文字 str hello worldstr "hello world"一个多行字符串使用三个单引号或三个双引号创建的。 多行字符串文字 str Say helloto pythonprogra…