当前位置: 首页 > news >正文

探索Java 8 Stream API:现代数据处理的新纪元

Stream流

Stream初探:何方神圣?

Stream流是一种处理集合数据的高效工具,它可以让你以声明性的方式处理数据集合。Stream不是存储数据的数据结构,而是对数据源(如集合、数组)的运算操作概念,支持函数式编程风格

特性

  • 可以配合lambda写出简洁代码。
  • 链式操作:支持一系列中间操作(如filter, map)和最终操作(如forEach, collect),这些操作可以链接起来,形成一个管道来处理数据。
  • 延迟执行:中间操作不会立即执行,而是构建一个执行计划,直到遇到最终操作时才一次性完成所有操作,这种方式可以提高效率。
  • 并行处理:支持并行处理,通过调用parallelStream()方法,可以轻松地利用多核处理器的优势,无需手动编写多线程代码。
  • 类型安全:利用泛型,Stream操作可以在编译期检查类型错误,提高代码的安全性和可读性。

如何获得Stream流

Java提供了几种方式,可以让我们获得Stream流

  1. [集合创建流]Collection 接口的 stream()或 parallelStream()方法
  2. [自由值创建]静态的 Stream.of(…)、Stream.empty()方法
  3. [数组创建流]Arrays.stream(array)
  4. 静态的 Stream.generate()方法生成无限流,接受一个不包含引元的函数
  5. 静态的 Stream.iterate()方法生成无限流,接受一个种子值以及一个迭代函数
  6. Pattern 接口的 splitAsStream(input)方法
  7. 静态的 Files.lines(path)、Files.lines(path, charSet)方法
  8. 静态的 Stream.concat()方法将两个流连接起来
代码演示
          /** 三种常用获得流的方法* 1.Collection接口中的stream()方法* 2.Stream类的静态方法 of()* 3.Arrays工具类的stream(T[] array)方法**/// 用Collection接口中的stream()方法,获得流ArrayList<Integer> list = new ArrayList<>();// 创建集合list.add(1);list.add(2);list.add(3);Stream<Integer> stream1 = list.stream();// 获得流// 2.Stream类的静态方法 of()Stream<Integer> stream2 = Stream.of(1, 2, 3, 4);// 获得流//3.Arrays工具类的stream(T[] array)方法int[] arr = {1,2,3,4};IntStream stream3 = Arrays.stream(arr);// 获得流

Stream方法操作

Stream流就是流式处理数据,流的操作有很多种

  • 中间操作(真正处理数据的操作)
    • 中间操作就是执行完返回的是一个流,即可以**继续执行**流操作
    • 敲代码来说,就是使用中间操作的方法,写完继续再.调用其他方法
  • 终止操作(将操作完的结果返回)
    • 敲代码来说,调用终止方法,代码就结束;
操作函数说明
中间操作filter(Predicate)将结果为false的元素过滤掉
中间操作map(Function)转换元素的值,可以用方法引元或者lambda表达式
中间操作flatMap(Function)若元素是流,将流摊平为正常元素,再进行元素转换(合并两个流为一个流)
中间操作limit(long n)保留前n个元素
中间操作skip(long n)跳过前n个元素
中间操作concat(Stream s1, Stream s2)将两个流拼接起来
中间操作distinct()剔除重复元素
中间操作sorted()将Comparable元素的流排序
中间操作sorted(Comparator)将流元素按Comparator排序
中间操作peek(Consumer)流不变,但会把每个元素传入fun执行,可以用作调试
终结操作max(Comparator)取最大值
终结操作min(Comparator)取最小值
终结操作count()统计元素数量
终结操作findFirst()获得流的第一个元素
终结操作findAny()返回任意元素
终结操作anyMatch(Predicate)任意元素匹配时返回true
终结操作allMatch(Predicate)所有元素匹配时返回true
终结操作noneMatch(Predicate)没有元素匹配时返回true
终结操作reduce(Function)从流中计算某个值,接受一个二元函数作为累积器,从前两个元素开始持续应用它,累积器的中间结果作为第一个参数,流元素作为第二个参数
终结操作iterator()迭代器迭代元素
终结操作forEach(Consumer)lambda的方式迭代
终结操作forEachOrdered(Consumer)可以应用在并行流上以保持元素顺序

5.2.1 中间操作

下面演示流的操作使用 - 中间操作

package day613.jdk8New.stream;import java.util.ArrayList;
import java.util.Comparator;
import java.util.stream.Stream;public class StreamAPITest {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();// 创建集合list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);list.add(6);Stream<Integer> stream1 = list.stream();// 获得流/** void forEach(Consumer<? super T> action);* ---遍历流* ---参数类型:Consunmer* -----使用lambda重写Consumer接口的 void accept(T t)*///遍历流//stream1.forEach(t -> System.out.print(t + " "));// 1 2 3 4 5 6/** Stream<T> filter(Predicate<? super T> predicate);* ---过滤,即过滤掉不想要的数据,留下想要的* ---参数类型 Predicate* -----使用lambda重写Predicate接口的 boolean test(T t)*///过滤奇数,留下偶数//stream1.filter(t->t % 2 == 0).forEach(t-> System.out.print(t + " "));// 2 4 6/** <R> Stream<R> map(Function<? super T, ? extends R> mapper);* ---转换元素的值* ---参数类型 Function* -----使用lambda重写Function接口的 R apply(T t)*///将流中的整型转换成字符串类型,并遍历//stream1.map(t->String.valueOf(t)).forEach(t-> System.out.print(t + " "));//1 2 3 4 5 6/**  Stream<T> limit(long maxSize);* ---保留前maxSize个元素* ---参数类型 long*///保留前四个//stream1.limit(4).forEach(t-> System.out.print(t + " "));// 1 2 3 4/**   Stream<T> skip(long n);* ---跳过前n个元素* ---参数类型 long*///跳过前四个//stream1.skip(4).forEach(t-> System.out.print(t + " "));// 5 6/** Stream<T> sorted(Comparator<? super T> comparator);* ---排序* ---参数类型 Comparator* -----使用lambda重写Comparator接口的 int compare(T o1, T o2);*///降序排序stream1.sorted((o1,o2) -> o2 - o1 ).forEach(t-> System.out.print(t + " "));}}
练习:
给定ArrayList<Integer>集合,
先过滤数据只保留偶数,
后对数据进行降序排序,
去除重复元素,
将元素转成String类型
后将每个元素拼接上《》后输出 
  public static void test() {ArrayList<Integer> list = new ArrayList<>( );list.add(3);list.add(1);list.add(3);list.add(2);list.add(4);list.add(6);list.add(5);list.add(7);list.add(5);list.add(6);list.add(9);list.add(8);list.add(10);list.add(7);// 获得流Stream<Integer> stream = list.stream( );// 先过滤数据只保留偶数// 后对数据进行降序排序,// 去除重复元素,// 将元素转成String类型// 后将每个元素拼接上《》后输出stream.filter(e -> e % 2 == 0).sorted((o1,o2) -> o2 - o1).distinct().map(e -> String.valueOf(e)).forEach(e -> System.out.println("《"+e+"》" ));}

5.2.3 注意事项

Stream流的操作注意事项

  1. 流的操作只能使用一次,也就是说执行过终结操作后不能再继续使用

    否则报错报错IllegalStateException stream has already been closed

  2. 使用中间操作,返回新的流

  3. 没有终止操作,就不会有结果,换句话说,没有终结操作,中间操作是 不会执行的

	public static void test2() {Stream<Integer> stream = Stream.of(1, 2, 3);stream.filter((e) -> {System.out.println("正在过滤元素:"+e );return e % 2 == 0;});// 没有终结操作,中间的filter不会执行,输出语句不会执行}

在这里插入图片描述

5.3 流的收集

流操作完,将数据流中的数据再返回成数组和集合 --> 这就是收集流

将流收集到集合或数组中

  • collect() 收集到集合
    • collect(Collectors.toList( )) 将stream流中的数据,收集到List集合
    • collect(Collectors.toSet( )) 将stream流中的数据,收集到set集合
  • toArray 收集到数组
		ArrayList<Integer> list = new ArrayList<>( );list.add(3);// 获得流Stream<Integer> stream = list.stream( );// 先过滤数据只保留偶数// 后对数据进行降序排序,// 去除重复元素,// 将元素转成String类型// 变成ArrayList<String>返回List<String> list2 = stream.filter(e -> e % 2 == 0).sorted((o1, o2) -> o2 - o1).distinct( ).map(e -> String.valueOf(e)).collect(Collectors.toList( ));// 收集为List集合

最后

如果感觉有收获的话,点个赞 👍🏻 吧。
❤️❤️❤️本人菜鸟修行期,如有错误,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍在这里插入图片描述

相关文章:

探索Java 8 Stream API:现代数据处理的新纪元

Stream流 Stream初探&#xff1a;何方神圣&#xff1f; Stream流是一种处理集合数据的高效工具&#xff0c;它可以让你以声明性的方式处理数据集合。Stream不是存储数据的数据结构&#xff0c;而是对数据源&#xff08;如集合、数组&#xff09;的运算操作概念&#xff0c;支…...

vim 删除光标到最后一行的所有内容

在 Vim 中删除从光标所在位置到文件末尾的所有内容 删除从光标所在位置到文件末尾的所有内容使用 dG 命令 参考 删除从光标所在位置到文件末尾的所有内容 使用 dG 命令 确保你在正常模式下&#xff08;按 Esc 键&#xff09;。移动光标到你想要开始删除的位置。输入以下命令&…...

k8s之kubelet证书时间过期升级

1.查看当前证书时间 # kubeadm alpha certs renew kubelet Kubeadm experimental sub-commands kubeadm是一个用于引导Kubernetes集群的工具&#xff0c;它提供了许多命令和子命令来管理集群的一生周期。过去&#xff0c;某些功能被标记为实验性的&#xff0c;并通过kubeadm a…...

5G消息 x 文旅 | 一站式智慧文旅解决方案

5G消息 x 文旅 | 一站式智慧文旅解决方案 文旅 x 5G 消息将进一步强化资源整合&#xff0c;满足游客服务需求、企业营销需求、政府管理需求&#xff0c;推进文化旅游项目的智慧化、数字化&#xff0c;增强传播力、竞争力和可持续性。5G 消息的“原生入口”、“超强呈现”、“智…...

如何评估员工在新版FMEA培训后应用知识的效果?

随着制造业的快速发展&#xff0c;新版FMEA已成为企业提升产品质量、减少故障风险的关键一环。然而&#xff0c;培训只是第一步&#xff0c;如何有效评估员工在新版FMEA培训后应用知识的效果&#xff0c;才是确保培训成果转化的关键所在。 评估员工知识应用效果的首要步骤是制定…...

python脚本之解析命令参数

import requests import argparseprint(f"{__name__}:start")parser argparse.ArgumentParser(description使用方法) parser.add_argument(-p, --prefix, typestr, help域名) parser.add_argument(-t, --token, typestr, helptoken) parser.add_argument(-i, --queu…...

当JS遇上NLP:开启图片分析的奇幻之旅

前言 在当今科技飞速发展的时代&#xff0c;JavaScript&#xff08;JS&#xff09;作为广泛应用的编程语言&#xff0c;展现出了强大的活力与无限的可能性。与此同时&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域也正在经历着深刻的变革与进步。 当这两者碰撞在一…...

trpc快速上手

tRPC (Type-safe Remote Procedure Call) 是一个用于构建类型安全的 API 的框架&#xff0c;它能够在前端和后端之间共享类型&#xff0c;确保类型安全性。这对于使用 TypeScript 的项目特别有用&#xff0c;因为它消除了前后端类型不一致的问题&#xff0c;提高了开发效率和代…...

知识图谱存在的挑战---隐私、安全和伦理相关和测试认证相关

文章目录 隐私、安全和伦理相关测试认证相关 隐私、安全和伦理相关 从部署拓扑结构而言&#xff0c;知识图谱技术以数据为核心、数据库为载体的方式来存储&#xff0c;有单机、云平台、集群及其组合的部署方式&#xff0c;结合大数据平台、云平台、业务系统、灾备、网络系统及其…...

课时155:脚本发布_简单脚本_命令罗列

2.1.1 命令罗列 学习目标 这一节&#xff0c;我们从 基础知识、简单实践、小结 三个方面来学习 基础知识 简介 目的&#xff1a;实现代码仓库主机上的操作命令功能即可简单实践 实践 查看脚本内容 #!/bin/bash # 功能&#xff1a;打包代码 # 版本: v0.1 # 作者: 书记 # …...

借助ollama实现AI绘画提示词自由,操作简单只需一个节点!

只需要将ollama部署到本地&#xff0c;借助comfyui ollama节点即可给你的Ai绘画提示词插上想象的翅膀。具体看详细步骤&#xff01; 第一步打开ollama官网&#xff1a;https://ollama.com/&#xff0c;并选择models显存太小选择的是llama3\8b参数的instruct-q6_k的这个模型。 运…...

PyTorch -- Visdom 快速实践

安装&#xff1a;pip install visdom 注&#xff1a;如果安装后启动报错可能是 visdom 版本选择问题 启动&#xff1a;python -m visdom.server 之后打开出现的链接 http://localhost:8097Checking for scripts. Its Alive! INFO:root:Application Started INFO:root:Working…...

基于xilinx FPGA的QSFP调试使用经验

1 概述 本文用于记录QSFP在调试使用时遇到的一些经验教训&#xff0c;防止后来者踩相同的坑。 参考手册&#xff1a; 《AMQ28-SR4-M1_V1.0》 《QSFP-DD-Hardware-rev4p0-9-12-18-clean》 2 QSFP简介 QSFP&#xff08;Quad Small Form-facor Pluggable&#xff09;即四通道SFP…...

WPF 使用Image控件显示图片

Source属性 Source属性用来告诉Image组件要展示哪张图片资源的一个入口&#xff0c;通常是图片的路径。也许是本地路径&#xff0c;也许是网络路径。 本地图片路径加载方式 使用相对路径&#xff0c;相对于工程目录的路径&#xff0c;当设置Width属性时&#xff0c;图片会等…...

合肥工业大学内容安全实验一:爬虫|爬新闻文本

✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆 🔥系列专栏 :合肥工业大学实验课设 📃新人博主 :欢迎点赞收藏关注,会回访! 💬舞台再大,你不上台,永远是个观众。平台再好,你不参与,永远是局外人。能力再大,你不行动,只能看别人成功!没有人会关心你付…...

自动驾驶---Perception之视觉点云雷达点云

1 前言 在自动驾驶领域&#xff0c;点云技术的发展历程可以追溯到自动驾驶技术的早期阶段&#xff0c;特别是在环境感知和地图构建方面。 在自动驾驶技术的早期技术研究中&#xff0c;视觉点云和和雷达点云都有出现。20世纪60年代&#xff0c;美国MIT的Roberts从2D图像中提取3D…...

maven 显式依赖包包含隐式依赖包,引起依赖包冲突

问题&#xff1a;FlinkCDC 3.0.1 代码 maven依赖包冲突 什么是依赖冲突 依赖冲突是指项目依赖的某一个jar包&#xff0c;有多个不同的版本&#xff0c;因而造成类包版本冲突 依赖冲突的原因 依赖冲突很经常是类包之间的间接依赖引起的。每个显式声明的类包都会依赖于一些其它…...

Spring应用如何打印access日志和out日志(用于分析请求总共在服务耗费多长时间)

我们经常会被问到这样一个问题。你接口返回的好慢呀&#xff0c;能不能提升一下接口响应时间啊&#xff1f;这个时候我们就需要去分析&#xff0c;为什么慢&#xff0c;慢在哪。而这首先应该做的就是确定接口返回时间过长确实是在服务内消耗的时间。而不是我们将请求发给网关或…...

SpringBoot整合SpringDataRedis

目录 1.导入Maven坐标 2.配置相关的数据源 3.编写配置类 4.通过RedisTemplate对象操作Redis SpringBoot整合Redis有很多种&#xff0c;这里使用的是Spring Data Redis。接下来就springboot整合springDataRedis步骤做一个详细介绍。 1.导入Maven坐标 首先&#xff0c;需要导…...

电脑怎么录制游戏视频?轻松捕捉每一帧精彩

随着游戏产业的蓬勃发展&#xff0c;越来越多的玩家不仅满足于在游戏世界中的探索与冒险&#xff0c;更希望将自己的游戏精彩瞬间记录下来&#xff0c;分享给更多的朋友。可是电脑怎么录制游戏视频呢&#xff1f;本文旨在为广大游戏爱好者提供一份详细的电脑游戏视频录制攻略&a…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...