Java stream 进阶版

news2024/9/9 0:36:11

1、Stream 概述

Java 8 引入了 Stream API,它是一种用于简化集合和数组操作的强大工具。Stream API 允许我们将集合或数组视为流,并在流上进行各种操作,如筛选、排序、聚合等。

Stream API 的核心概念是 Stream 流,它代表了一个数据流,其中包含了一系列的元素。这些元素可以通过 Stream API 进行各种操作,而不需要直接修改原始数据源。

Stream API 提供了三种主要的方法:

  1. 获取 Stream 流:通过创建一条流水线,并将数据放到流水线上准备进行操作。
  2. 中间方法:这些方法可以在流水线上进行操作,每次操作完毕之后,还可以继续进行其他操作。这种操作不会改变原始数据,而是返回一个新的流。
  3. 终结方法:一个 Stream 流只能有一个终结方法,它是流水线上的最后一个操作。这个方法将返回一个新的集合或值。

此外,Stream API 还具有延迟执行特性。这意味着,只有当我们调用终端操作时,中间操作才会执行。这种特性使得 Stream API 在处理大量数据时非常高效。

总的来说,Java Stream API 提供了一种灵活且高效的方式来处理集合和数组,它可以让我们更加专注于数据的操作,而不需要关心底层的实现细节。

2、Stream 的创建

 Stream可以通过集合数组创建。

1、通过 java.util.Collection.stream() 方法用集合创建流

List<String> list = Arrays.asList("a", "b", "c");
// 创建一个顺序流
Stream<String> stream = list.stream();
// 创建一个并行流
Stream<String> parallelStream = list.parallelStream();

2、使用java.util.Arrays.stream(T[] array)方法用数组创建流

int[] array={1,3,5,6,8};
IntStream stream = Arrays.stream(array);

3、使用Stream的静态方法:of()、iterate()、generate()

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);

Stream<Integer> stream2 = Stream.iterate(0, (x) -> x + 3).limit(4);
stream2.forEach(System.out::println);

Stream<Double> stream3 = Stream.generate(Math::random).limit(3);
stream3.forEach(System.out::println);

输出结果:

0 3 6 9
0.6796156909271994
0.1914314208854283
0.8116932592396652

streamparallelStream的简单区分: stream是顺序流,由主线程按顺序对流执行操作,而parallelStream是并行流,内部以多线程并行执行的方式对流进行操作,但前提是流中的数据处理没有顺序要求。例如筛选集合中的奇数,两者的处理不同之处:

如果流中的数据量足够大,并行流可以加快处速度。

除了直接创建并行流,还可以通过parallel()把顺序流转换成并行流:

Optional<Integer> findFirst = list.stream()
                                    .parallel()
                                    .filter(x->x>6)
                                    .findFirst();

3 Stream的使用 

在使用stream之前,先理解一个概念:Optional 。

Optional类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
更详细说明请见:菜鸟教程Java 8 Optional类

3.1 遍历/匹配(foreach/find/match)

Stream也是支持类似集合的遍历和匹配元素的,只是Stream中的元素是以Optional类型存在的。Stream的遍历、匹配非常简单。
在这里插入图片描述

public class StreamTest {
	public static void main(String[] args) {
        List<Integer> list = Arrays.asList(7, 6, 9, 3, 8, 2, 1);

        // 遍历输出符合条件的元素
        list.stream().filter(x -> x > 6).forEach(System.out::println);
        // 匹配第一个
        Optional<Integer> findFirst = list.stream().filter(x -> x > 6).findFirst();
        // 匹配任意(适用于并行流)
        Optional<Integer> findAny = list.parallelStream().filter(x -> x > 6).findAny();
        // 是否包含符合特定条件的元素
        boolean anyMatch = list.stream().anyMatch(x -> x < 6);
        System.out.println("匹配第一个值:" + findFirst.get());
        System.out.println("匹配任意一个值:" + findAny.get());
        System.out.println("是否存在大于6的值:" + anyMatch);
    }
}

预期结果:

 7
9
8
匹配第一个值:7
匹配任意一个值:8
是否存在大于6的值:true

3.2 筛选(filter)

筛选,是按照一定的规则校验流中的元素,将符合条件的元素提取到新的流中的操作。
在这里插入图片描述

案例一:筛选出Integer集合中大于7的元素,并打印出来

public class StreamTest {
	public static void main(String[] args) {
		List<Integer> list = Arrays.asList(6, 7, 3, 8, 1, 2, 9);
		Stream<Integer> stream = list.stream();
		stream.filter(x -> x > 7).forEach(System.out::println);
	}
}

预期结果:

8 9

案例二: 筛选员工中工资高于8000的人,并形成新的集合。 形成新集合依赖collect(收集),后文有详细介绍。

public class StreamTest {
	public static void main(String[] args) {
		List<Person> personList = new ArrayList<Person>();

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

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

相关文章

使用JSON-Server快速搭建RESTful API接口

​​​​​​​ 概要 随着前端技术的快速发展&#xff0c;前后端分离已经成为了一种趋势。在前后端分离的架构中&#xff0c;前端需要与后端进行数据的交互&#xff0c;这就需要后端提供RESTful API接口。而在开发过程中&#xff0c;我们常常需要模拟后端数据接口&#xf…

大数据CloudSim应用实践

CloudSimExampleA.java 1准备 1.1操作系统 本实验在Windows 7 或Windows 10系统运行均可。 1.2软件 cloudsim-3.0.3.zip&#xff1b; commons-math3-3.2-bin.zip&#xff1b; jdk-8u152-windows-x64.exe&#xff1b; eclipse-jee-neon-3-win32-x86_64 所需资料链接&#xff1…

Python开发工具PyCharm v2023.3全新发布——全面推出AI Assistant工具

JetBrains PyCharm是一种Python IDE&#xff0c;其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外&#xff0c;该IDE提供了一些高级功能&#xff0c;以用于Django框架下的专业Web开发。 PyCharm v2023.3正式版下载 在 PyCharm 2023.3 中&#xff0c;每…

C语言实现Hoare版快速排序(递归版)

Hoare版 快速排序是由Hoare发明的&#xff0c;所以我们先来讲创始人的想法。我们直接切入主题&#xff0c;Hoare版快速排序的思想是将一个值设定为key&#xff0c;这个值不一定是第一个&#xff0c;如果你选其它的值作为你的key&#xff0c;那么你的思路也就要转换一下&#xf…

数据手册Datasheet解读-肖特基二极管笔记

数据手册Datasheet解读笔记1-肖特基二极管 数据手册大体结构共包含10个部分肖特基二极管-SS14第一重点关注点&#xff1a;极限值第二重点关注点&#xff1a;电气特性 数据手册大体结构共包含10个部分 1.Features一特性 2.Application一应用 3.Description一说明4.Pin Configur…

c语言链表的基本操作

在C语言中&#xff0c;链表是一种常见的数据结构&#xff0c;它由一系列节点组成&#xff0c;每个节点包含一个数据元素和一个指向下一个节点的指针。链表的基本操作包括创建、插入、删除和遍历等。 下面是一个简单的链表节点结构体定义&#xff1a; struct Node { int da…

【DataSophon】大数据管理平台DataSophon-1.2.1安装部署详细流程

&#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&am…

扁平化菜单功能制作

网页效果&#xff1a; HTML部分&#xff1a; <body><ul class"nav"><li><a href"javascript:void(0);">菜单项目一</a><ul><li>子菜单项01</li><li>子菜单项02</li><li>子菜单项03<…

【c语言】【visual studio】动态内存管理,malloc,calloc,realloc详解。

引言&#xff1a;随着大一期末的到来&#xff0c;想必许多学生都学到内存的动态管理这一部分了&#xff0c;看望这篇博客后&#xff0c;希望能解除你心中对这一章节的疑惑。 (・∀・(・∀・(・∀・*) 1.malloc详解 malloc的头文件是#include <sdtlib.h>,malloc - C Ref…

Web基本架构与Web攻击介绍(SQL注入、XSS、CSRF)

目录 Web基础 Web服务器介绍 Web攻击 SQL注入攻击——针对网站数据库的攻击 XSS跨站脚本攻击——针对用户浏览器的攻击 CSRF跨站请求伪造攻击——针对用户浏览器的攻击 三种攻击方式的区别 Web基础 什么是Web Web指的是万维网&#xff08;World Wide Web&#xff09;&…

JJJ:组合数据类型

文章目录 序列的索引及切片操作 p42序列的相关操作 p43 序列的索引及切片操作 p42 序列&#xff1a; 一个用于存储多个值的连续空间 每个值都对应一个整数的编号&#xff0c;叫做索引 索引分为&#xff1a;正向递增索引、反向递减索引 序列结构实例&#xff1a; 字符串、 列…

AOP切入点表达式和使用连接点获取匹配到的方法信息

目录 第一种 execution(访问修饰符? 返回值 包名.类名.?方法名(方法参数) throws 异常?) 第二种 annotation(com.itheima.anno.Log 首先&#xff0c;自定义一个注解&#xff0c;可以自己随意命名&#xff1a; 第一种 execution(访问修饰符? 返回值 包名.类名.?方法名…

zookeeper4==zookeeper源码阅读,FOLLOWER收到了需要LEADER执行的命令后各节点会执行什么

上面已经阅读并观察了节点确定自己的身份后会做些什么&#xff0c;大致就是比对双方信息然后完成同步。 本篇阅读&#xff0c; FOLLOWER收到了需要LEADER执行的命令后&#xff0c;怎么同步给LEADER的&#xff0c;并且LEADER会执行什么操作。 源码启动zkCli用于测试 将原本的代…

解决PP材质粘合问题用PP专用UV胶水

PP材料已经广泛应用于各行各业&#xff0c;在粘接中会有不同的问题需求&#xff0c;那么使用专用于PP的UV胶水可能是解决PP材质粘合问题的一种有效方法。 主要在于&#xff1a;UV胶水在紫外线照射下可以快速固化&#xff0c;形成坚固的连接。所以使用PP专用UV胶水时可以考虑&am…

如何在Docker部署draw.io流程图软件并实现公网远程访问

前言 提到流程图&#xff0c;大家第一时间可能会想到Visio&#xff0c;不可否认&#xff0c;VIsio确实是功能强大&#xff0c;但是软件为收费&#xff0c;并且因为其功能强大&#xff0c;导致安装需要很多的系统内存&#xff0c;并且是不可跨平台使用。所以&#xff0c;今天给…

使用axios的详细图文教程

介绍 当我们使用Vue开发项目时&#xff0c;会发送Ajax请求服务器接口&#xff0c;会对axios封装。 Axios&#xff08;ajax i/o system&#xff09;不是一种新技术&#xff0c;本质上也是对原生XHR&#xff08;XMLHttpReques&#xff09;的封装&#xff0c;只不过它是基于Pr…

和葡萄酒时为什么要写品酒笔记?

如果你不把你的想法写下来&#xff0c;它们可能会在你离开房间之前就离开你的大脑。写笔记&#xff0c;包括令人难忘的品酒笔记&#xff0c;它是关于记录一些超越今天和明天的有意义的事情。这是你的记忆葡萄酒&#xff0c;对你来说最相关、最有区别的就是最重要的。最后&#…

Keil新建STM32软件工程 - (详细步骤图文)

文章目录 1. 前言2. 下载芯片对应的Keil开发包3. 下载芯片对应的标准外设库 - STM32F10x_StdPeriph_Lib_Vx.x.x4. 新建工程文件夹 - Demo34.1 移植标准外设库4.2 启动文件介绍及如何选择 5. 新建软件工程 - Demo5.1 打开Keil → Project → New uVision Project5.2 选择芯片型号…

CSS 的背景属性(开发中常用)

目录 1 内容预览 背景颜色 背景图片 背景平铺 背景图片位置(常用) 背景图像固定 背景复合写法 背景色半透明 实现案例 1 内容预览 背景属性可以设置背景颜色、背景图片、背景平铺、背景图片位置、背景图像固定等。 注意&#xff1a; 把表格中的五个属背下来&#xff0c…

朱卫明:从韶关走向世界的创作型歌手

朱卫明&#xff0c;艺名Aming&#xff0c;是一位来自广东韶关的杰出唱作音乐人。他以其独特的创作才华和深情的嗓音&#xff0c;赢得了众多歌迷的喜爱。作为一名创作型歌手&#xff0c;朱卫明用音乐传递情感&#xff0c;用歌声打动人心。 一、早年经历与音乐启蒙 朱卫明出生于…