Java 8中新特性Stream的详细理解和使用

news2024/12/23 12:44:28

Java 8中新特性Stream的基本理解和使用

Stream基本概念

Stream流是来自数据源的元素队列并支持聚合操作

**元素:**是特定类型的对象,是数据源形成的一个队列。Java中Stream不会存储元素,而是按需计算

数据源:Stream流数据的来源。可以是集合,数组,I/O Channel ,产生器Generator等

聚合操作:类似SQL语句的一系列操作,比如filter,map,sorted等。

Stream不是集合元素,不是数据结构来保存数据,是一个有关数据算法和计算的流:

获取一个数据源source => 数据转换 => 执行操作获取需要的结果,每次转换后原来的Stream对象不变,返回一个新的Stream对象,这样可以使得对Stream的操作链式排列,形成一个管道

还是不能理解?

简洁理解

Stream是对集合Collection对象功能的增强,Stream可以对集合对象进行便利高效的聚合操作和大批量的数据操作,集合类存有的元素都是划分内存空间存储的,数据量很大的集合类会占用大量的内存。Stream的元素是延迟计算的,即只有在访问的时候才会进入内存进行计算。

其次集合类的迭代逻辑是调用者负责的,通常使用for循环。Stream中的迭代是隐含在对Stream的各种操作当中的。

Stream操作的基本特征:

****Pipelining:****中间操作都会返回流本身。多个操作可以串成一个管道。这样就可以对操作进行优化,比如延迟执行和短路

内部迭代:对集合的遍历都是Iterator或者是for-Each操作,显示地在集合外部进行迭代。Stream提供了内部迭代的方式,通过访问者模式Vistor实现

Stream的特点:

不存储:

数据流Stream不是存储元素的数据结构

数据流Stream将数据元素从源数据 结构,数组,生成器函数和输入输出管道中传递到计算机操作的管道中

功能性:

一个数据流Stream中的流操作都会产生一个结果,不会修改源数据Stream中的元素

延迟计算

许多流操作中的各种操作,比如过滤,映射,去重等,只有访问时才会进行计算,这样可以有更多的机会进行优化

无界性

集合的大小是有界的,但数据流Stream可以是无界的,短路操作等可以允许无限流计算在有限的时间内完成。

如何生成流 ?

集合接口有两种方式生成流:

stream():为集合创建串行流

paralleStream():为集合创建并行流,并行流可以充分发挥多核处理器的优势,使用fork和join并行方式来拆分任务和加速处理过程

stream()

创建第一个示例:

实际运用:如项目中查找学生成绩为空的学生信息

****注意:****Arrays.asList()是一个Java数组与集合之间的桥梁方法,它可以将一个数组转换为一个List集合。使用Arrays.asList()方法,我们可以将一个数组转换为一个List集合,然后使用List的方法来操作这个集合

//输出不是空的字符串
        List<String> strings= Arrays.asList("abs","","dda","","dark","");
        List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
        System.out.println(filtered);

运行结果:

在这里插入图片描述

forEach和limit

提供更好的遍历方式,遍历数据

Stream 提供新的方法 ’ forEach‘ 来迭代流中的每个数据。

limit方法用于获取指定数量的流

通过流方式随机打印10条数据

//使用forEach输出10个随机数
        Random random = new Random();
       random.ints().limit(15).forEach(System.out::println);

运行结果:

在这里插入图片描述

map

map方法用于映射每个元素到对应的结果

        //使用map输出元素的2的倍数
        List<Integer> numbers = Arrays.asList(155,151,4,56,2,3,15,30);
        List<Integer> dList = numbers.stream().map(x -> 2*x).collect(Collectors.toList());
        System.out.println(dList);

运行结果:

在这里插入图片描述

filter

filter 方法用于通过设置的条件过滤出元素

//使用filter方法过滤出空字符串
        List<String> strings1 = Arrays.asList();
        //获取空字符串的数量
        long count = strings1.stream().filter(string -> string.isEmpty()).count();
        System.out.println(count);

在这里插入图片描述

sorted

sorted方法用于对流进行排序

对随机生成的数进行排序:

        //使用forEach输出10个随机数
		//ints()返回的是整数值最大到最小(即Long范围内)
        Random random = new Random();
        random.ints().limit(10).sorted().forEach(System.out::println);

运行结果:

在这里插入图片描述

Collectors(收集器)

Collectors类实现了很多规约操作(即将数据流收集成另外一种数据格式,如:toList、toSet、toMap等数据结构),将流数据转换为集合或者聚合集合。之前字符串拼接一般是用StringBuffer的append()方法。在JDK8中,可以采用函数式编程(使用Collectors.join 收集器)的方式对字符串进行更优雅的拼接。Collectors.joining收集器:支持灵活的参数配置,可以指定字符串连接时的分隔符,前缀和后缀字符串

示例1:

        //定义一个String类型的集合
        List<String> strings2 = Arrays.asList("abs","","dda","","dark","");
        //将strings2字符串集合按照非空的条件过滤筛选出来到一个新集合内
        List<String> filtered1 = strings2.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
        System.out.println("筛选后的字符串集合:"+filtered1);

        //将filtered1集合通过Collectors聚合为一个字符串,按“”的方式连接
        String mergedString = strings2.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining());
        System.out.println("合拼的字符串"+mergedString);

运行结果:没有任何分隔符的将字符串合拼在一起

在这里插入图片描述

示例2:

String mergedString = strings2.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining("->"));

运行结果:通过"->"分隔符将字符串拼接

在这里插入图片描述

示例3:

String mergedString1 = strings2.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining("-》","{","}"));
        System.out.println("合拼的字符串2:"+mergedString1);

运行结果:通过"-》"分隔拼接的同时同时设置前缀和后缀

在这里插入图片描述

统计

另外,一些产生统计结果的收集器也很有用

如:开发时会对价格进行求平均,总和,找到最大或者最小值时就能便捷的使用

示例:

        SqlSession sqlSession = sqlSessionUtil.getSqlSession();
        //获取StudentDao对象
        StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
        //获取所有学生对象信息
        List<Student> list = studentDao.getAllStudents();
        list.forEach(System.out::println);
        IntSummaryStatistics summaryStatistics = list.stream().mapToInt(student -> student.getSage()).summaryStatistics();
        System.out.println("他们的年龄和为:" + summaryStatistics.getSum());
        System.out.println("他们的平均年龄为:"+summaryStatistics.getAverage());
        System.out.println("他们之间最大年龄为:"+summaryStatistics.getMax());
        System.out.println("他们之间最小年龄为:"+summaryStatistics.getMin());
        System.out.println("数据库中总的数据条数为:"+summaryStatistics.getCount());

运行结果:

在这里插入图片描述

parallelStream

parallelStream是流并行处理程序的代替方法,可以和stream()的顺序运行之间任意切换

//使用filter方法过滤出空字符串
        List<String> strings1 = Arrays.asList("abs","","dda","","dark","");
        //获取空字符串的数量
        long count = strings1.parallelStream().filter(string -> string.isEmpty()).count();
        System.out.println(count);

运行结果:

在这里插入图片描述

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

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

相关文章

自定义函数 | R语言批量计算组间差值

批量字符替换、数值大小比较并重新赋值 cal_repeat()函数的实际操作1.不考虑处理变量。考虑多变量和指定2列变量的情况&#xff08;长数据&#xff09;&#xff1a;2.考虑处理变量。考虑多处理&#xff0c;多变量的情况&#xff08;长数据&#xff09;&#xff1a;3.考虑处理变…

Node【Global全局对象】

文章目录 &#x1f31f;前言&#x1f31f;Global全局对象&#x1f31f;Global对象属性与方法&#x1f31f;Global对象属性&#x1f31f;process&#x1f31f;Buffer类&#x1f31f;console &#x1f31f;写在最后 &#x1f31f;前言 哈喽小伙伴们&#xff0c;新的专栏 Node 已…

华为OD机试真题(Java),最优策略组合下的总的系统消耗资源数(100%通过+复盘思路)

一、题目描述 在通信系统中有一个常见的问题是对用户进行不同策略的调度&#xff0c;会得到不同系统消耗的性能。 假设由N个待串行用户&#xff0c;每个用户可以使用A/B/C三种不同的调度策略&#xff0c;不同的策略会消耗不同的系统资源。 请你根据如下规则进行用户调度&…

netty源码阅读--服务启动

背景 netty是一个非常成熟的NIO框架&#xff0c;众多apache的顶级项目底层通信框架都是用的是netty,本系列博客主要是记录自己复习netty源码的过程&#xff0c;重在理解netty的关键如&#xff1a;如何启动&#xff0c;如何接受网络数据、netty的内存管理机制以及编解码器等&am…

【KingSCADA】如何建立硬件系统及相关变量

小伙伴们大家好&#xff0c;我是雷工&#xff01; 本篇学习了解KingSCADA3.8如何建立硬件系统及相关变量&#xff0c;以下为学习过程和操作记录。 一、前言 本篇主要讲解如何定义设备&#xff0c;如何定义变量。 KingSCADA3.8的采集系统是指负责和现场设备进行通讯&#xff0…

通过azure学生认证拿到一年服务器使用权

通过azure学生认证 因为国内备案被迫找其他服务器 开始我买了一个华为的服务器&#xff0c;大家都知道&#xff0c;在国内&#xff0c;服务器是需要备案的。如果你备案过的话&#xff0c;就知道这个是非常麻烦的事情。时间久不说。过程也是非常的繁琐。这个繁琐的过程&#x…

《Linux基础》06. 进程管理 · 服务管理

Linux基础-06 1&#xff1a;进程管理1.1&#xff1a;查看进程1.1.1&#xff1a;ps1.1.2&#xff1a;pstree1.1.3&#xff1a;top 1.2&#xff1a;终止进程1.2.1&#xff1a;kill1.2.2&#xff1a;killall 2&#xff1a;服务管理2.1&#xff1a;运行级别2.2&#xff1a;服务查看…

每日一练2023.4.17-2023.4.18

数轴上的bfs 农夫约翰被通知&#xff0c;他的一只奶牛逃逸了&#xff01;所以他决定&#xff0c;马上出发&#xff0c;尽快把那只奶牛抓回来&#xff0e; 他们都站在数轴上&#xff0e;约翰在N(0≤N≤100000)处&#xff0c;奶牛在K(0≤K≤100000)处&#xff0e;约翰有 两种办…

门控循环神经网络学习笔记

在介绍门控循环神经网络之前&#xff0c;先简单介绍循环神经网络的基本计算方式&#xff1a; 循环神经网络之称之为“循环”&#xff0c;因为其隐藏状态是循环利用的&#xff1a; 上一次输入计算出的隐藏状态与当前的输入结合&#xff0c;得到当前隐藏状态。 cur_output, cur…

【嵌入式笔/面试】嵌入式软件基础题和真题总结——操作系统

在学习的时候找到几个十分好的工程和个人博客&#xff0c;先码一下&#xff0c;内容都摘自其中&#xff0c;有些重难点做了补充&#xff01; 才鲸 / 嵌入式软件笔试题汇总 嵌入式与Linux那些事 阿秀的学习笔记 小林coding 百问网linux 嵌入式软件面试合集 2022年春招实习十四面…

电脑丢失的dll文件怎么一键修复?修复dll方法分享

电脑丢失的dll文件怎么一键修复&#xff1f;电脑状况常常让人遇到各种问题&#xff0c;其中“DLL文件丢失”是最常见的问题之一。在这篇文章中&#xff0c;我们会介绍为何会出现DLL文件丢失的问题&#xff0c;以及提供一种简单、快捷的DLL文件修复方法。 一.为何会出现DLL文件丢…

vue使用vue-mapvgl实现烟台市各区县行政区绘制、三维柱状图

一、效果展示 二、地图组件&#xff1a; vue-mapvgl https://docs.guyixi.cn/vue-mapvgl/#/ 三、代码 main.js //vue-mapvGL import VueBMap from vue-bmap-gl; import vue-bmap-gl/dist/style.css import VueMapvgl from vue-mapvgl; Vue.use(VueBMap); Vue.use(VueMapvg…

c++算法——算法章节-时间空间复杂度

算法开章咯 这次是csp-j组算法 枚举法常用排序合集hash一维前缀和vector结构体queuestack贪心-简单贪心区间递归二分setmap二叉树图的遍历-邻接矩阵迷宫问题-dfs-深度优先搜素bfs-广度优先搜索动态规划-简单动态规划-01背包动态规划-背包-多重背包二分答案 算法是什么嘛&…

腾讯云轻量4核8G12M应用服务器带宽、月流量详细性能评测

腾讯云轻量4核8G12M应用服务器带宽&#xff0c;12M公网带宽下载速度峰值可达1536KB/秒&#xff0c;折合1.5M/s&#xff0c;每月2000GB月流量&#xff0c;折合每天66GB&#xff0c;系统盘为180GB SSD盘&#xff0c;地域节点可选上海、广州或北京&#xff0c;4核8G服务器网来详细…

0基础同学如何快速入门学Python

转自&#xff1a;https://www.zhihu.com/question/596253606/answer/2994169972 想学Python的小伙伴&#xff0c;这里给你们汇总了&#xff1a;学习资源、平台、小白环境配置、相关课程、书籍资料&#xff01;并且&#xff0c;附送学习方法以及计划制定。 一、可以了解到Pyth…

Appuploader证书申请教程

转载&#xff1a;IOS证书制作教程 点击苹果证书 按钮 点击新增 输入证书密码&#xff0c;名称 这个密码不是账号密码&#xff0c;而是一个保护证书的密码&#xff0c;是p12文件的密码&#xff0c;此密码设置后没有其他地方可以找到&#xff0c;忘记了只能删除证书重新制作&…

还在精神内耗?还在焦虑?可以看看这个

作为一个即将毕业的本科生&#xff0c;总是会不由自主的焦虑。因为不考研&#xff0c;所以显得和同学们格格不入&#xff0c;每天都在进行精神内耗&#xff0c;但是我不经意间看到了一个东西-《邓宁克鲁格效应》 上述的四个阶段刻画出了一条典型的“大师养成之路”。但大师毕竟…

华为三层交换机命令集合,已经分好类了,网工建议收藏!

你好&#xff0c;这里是网络技术联盟站。 本文给大家带来的是华为三层交换机的命令集合&#xff0c;我已经分好类&#xff0c;大家可以收藏备用&#xff01; 一、系统管理命令 1.1 查看版本信息 display version此命令用于查看交换机的版本信息&#xff0c;包括交换机的软件…

【AI理论学习】深入理解Prompt Learning和Prompt Tuning

深入理解Prompt Learning和Prompt Tuning 背景Prompt Learning简介1. Prompt是什么&#xff1f;2. 为什么要使用Prompt&#xff1f;3. Prompt Learning的形式&#xff08;举例&#xff09;4. 有哪些Pre-training language model&#xff1f;5. 常见的Prompt Learning的方法 Pro…

WebRTC 源码分析——Android 视频硬件编码

作者&#xff1a;DevYK 1. 简介 本文将重点介绍在 Android 平台上&#xff0c;WebRTC 是如何使用 MediaCodec 对视频数据进行编码&#xff0c;以及在整个编码过程中 webrtc native 与 java 的流程交互。 本篇开始会先回顾一下 Andorid MediaCodec 的概念和基础使用&#xff0…