Java Stream API的基本使用方法

news2024/11/15 21:51:28

前言

Java各个版本所更新的主要内容:

1.Java SE 8:引入了一些新特性,如lambda表达式、Stream API、格式化日期、国际化等。此外,还对并发编程进行了改进,引入了线程安全的Stream API
2.Java SE 9:新增了分布式架构的支持,引入了CompletableFuture、ZK等新特性。此外,还对Jit编译器进行了改进,引入了Just-In-Time(JIT)编译器。
3.Java SE 10:主要是为了解决Java SE 9中的一些遗留问题,如null safety、improved ByteBuffer、stream API for Transforming、23种新的基本数据类型等。
4.Java SE 11:新增了许多新特性,如try-with-resources语法糖、独立密钥、Profiler、Crypto API for Java SE、gRPC等。此外,还对AOT和JIT进行了改进,引入了32位系统支持。
5.Java SE 12:主要是为了解决Java SE 11中的一些遗留问题,如security-77、Linux-specific changes、JVM常量库等。
6.Java SE 13:新增了HotSpot 1.13.10支持,削减了JDK知识库的大小,提高了JRE的性能。此外,还对AOT和JIT进行了改进,引入了JVM常量库。
7.Java SE 14:主要是为了修复Java SE 13中的一些漏洞,如CVE-2014-and-earlier、部分音频处理异常等。
8.Java SE 15:新增了Java Native Interface(JNI)支持,用于在Java应用程序中调用本地代码。此外,还对AOT和JIT进行了改进,引入了JVM常量库和Just-In-Time(JIT)编译器。
9.Java SE 16:主要是为了提高Java应用程序的性能和安全性,如JVM常量库、memory-mapped files、外部文件系统等。
10.Java SE 17:主要是为了解决Java SE 16中的一些遗留问题,如JCE-43、部分音频处理异常等。此外,还对AOT和JIT进行了改进,引入了Just-In-Time(JIT)编译器和%K%V等功能。
11.Java SE 18:新增了ZGC和Shenandoah等新特性,以及针对lambda表达式的语法变更。此外,还对并发编程进行了改进,引入了轻量级的stream API。
12.Java SE 19:主要是为了修复Java SE 18中的一些漏洞,如CVE-2020-1719等。
13.Java SE 20:新增了JDK-Convert-Tool和javax.el-api等新特性,以及对AOT和JIT进行了改进,引入了Just-In-Time(JIT)编译器和二次释放池等功能。
14.Java SE 21:主要是为了提高Java应用程序的性能和安全性,如JVM常量库、%K%V、嵌套的文件输入输出等。
15.Java SE 22:主要是为了解决Java SE 21中的一些遗留问题,如CVE-2021-candidates-197等。
16.Java SE 23:主要是为了提高Java应用程序的性能和安全性,如HotSpotSubproject、StandaloneMode、ZGC2、Shenandoah2等。
17.Java SE 24:主要是为了提高Java应用程序的性能和安全性,如autoboxing、华彩发光字等。
18.Java SE 25:主要是为了解决Java SE 24中的一些遗留问题,如CVE-2021-靠前年份等。

Stream API

Java Stream流(Stream API)是Java 8中引入的一种新的流式编程方式,它可以简化对集合的处理,提高代码的可读性和可维护性。
在这里插入图片描述

常用的方法

1.filter:根据指定条件过滤数据流,返回符合条件的元素。

public class DemoStreamAPI {
	public static void main(String[] args) {
		List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
		numbers.stream()  
			//过滤
        	.filter(n -> n % 2 != 0)  
        	//输出
        	.forEach(System.out::println);
	}
}

输出结果:
在这里插入图片描述

2.map:将数据流中的每个元素应用于指定的函数,返回一个新的数据流。

public class DemoStreamAPI {
	public static void main(String[] args) {
		List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
		numbers.stream()  
        	.filter(n -> n % 2 != 0)  
        	.map(n -> n * 2)  
        	.forEach(System.out::println);
	}
}

输出结果:
在这里插入图片描述

3.sorted:根据指定的比较器对数据流进行排序,返回一个新的排序后的数据流。

public class DemoStreamAPI2 {
	public static void main(String[] args) {  
        List<Order> ordersA = Arrays.asList(  
                new Order("2023-01-01", "completed", 100),  
                new Order("2023-01-02", "canceled", 50),  
                new Order("2023-01-03", "completed", 200),  
                new Order("2023-01-04", "canceled", 150),  
                new Order("2023-01-05", "completed", 250),  
                new Order("2023-01-06", "canceled", 100)  
        );
        ordersA.stream()
        .sorted(Comparator.comparing(Order::getTotalAmount))
        .collect(Collectors.toList())
        .forEach(i -> {
        	System.out.println(i.getOrderDate() + "====" + i.getTotalAmount());
        });
    }  
}

输出结果:
在这里插入图片描述

4.limit:返回数据流中前指定个数的元素。

public class DemoStreamAPI2 {
	public static void main(String[] args) {  
        List<Order> ordersA = Arrays.asList(  
                new Order("2023-01-01", "completed", 100),  
                new Order("2023-01-02", "canceled", 50),  
                new Order("2023-01-03", "completed", 200),  
                new Order("2023-01-04", "canceled", 150),  
                new Order("2023-01-05", "completed", 250),  
                new Order("2023-01-06", "canceled", 100)  
        );
        ordersA.stream()
        .limit(2)
        .sorted(Comparator.comparing(Order::getTotalAmount))
        .collect(Collectors.toList())
        .forEach(i -> {
        	System.out.println(i.getOrderDate() + "====" + i.getTotalAmount());
        });
    }  
}

输出结果:
在这里插入图片描述

5.forEach:对数据流中的每个元素执行指定的操作。

查看

6.collect:将数据流中的每个元素收集到指定的集合中。

public class DemoStreamAPI2 {
	public static void main(String[] args) {  
        List<Order> ordersA = Arrays.asList(  
                new Order("2023-01-01", "completed", 100),  
                new Order("2023-01-02", "canceled", 50),  
                new Order("2023-01-03", "completed", 200),  
                new Order("2023-01-04", "canceled", 150),  
                new Order("2023-01-05", "completed", 250),  
                new Order("2023-01-06", "canceled", 100)  
        );
        Map<String, List<Order>> groupByOrderStatus = ordersA.stream()
        .sorted(Comparator.comparing(Order::getTotalAmount))
        .collect(Collectors.groupingBy(Order::getOrderStatus));
        System.out.println(groupByOrderStatus.toString());
    }  
}

输出结果:

{canceled=[Order [orderDate=2023-01-02, orderStatus=canceled, totalAmount=50], Order [orderDate=2023-01-06, orderStatus=canceled, totalAmount=100], Order [orderDate=2023-01-04, orderStatus=canceled, totalAmount=150]], completed=[Order [orderDate=2023-01-01, orderStatus=completed, totalAmount=100], Order [orderDate=2023-01-03, orderStatus=completed, totalAmount=200], Order [orderDate=2023-01-05, orderStatus=completed, totalAmount=250]]}

7.anyMatch,allMatch,noneMatch

*anyMatch*:检查数据流中的元素**有一个**符合指定的条件,返回true;
*allMatch*:检查数据流中的元素是否**所有**都符合指定的条件;
*noneMatch* :检查数据流中的元素是否都不符合指定的条件。
public class DemoStreamAPI2 {
	public static void main(String[] args) {  
		List<String> list = new ArrayList<>();
		list.add("C");
		list.add("S");
		list.add("D");
		list.add("N");
		System.out.println(list.stream().anyMatch(i -> i.contains("C"))); // true
		System.out.println(list.stream().allMatch(i -> i.contains("C"))); // false
		System.out.println(list.stream().noneMatch(i -> i.contains("C"))); // false
    }  
}

8.reduce:可以对集合中的元素进行聚合操作,得到一个新的结果。

public class DemoStreamAPI2 {
	public static void main(String[] args) {  
		List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);  
		int sum = numbers.stream()  
		                .reduce(5, (a, b) -> a * b);  //集合中的元素做运算之后,再与第一个参数做运算
		System.out.println("Sum of numbers: " + sum);
    }  
}

输出结果:
在这里插入图片描述

总结

使用Stream API可以使代码更加简洁、清晰,提高开发效率。但是,使用不当可能会导致代码出现问题,因此需要仔细考虑使用场景和条件。在实际开发中,应该根据具体情况选择合适的数据结构和操作方法,以达到最佳的开发效果。

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

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

相关文章

李沐论文精度系列之十:GPT-4

文章目录 一、AIGC资讯速览1.1 Toolformer&#xff08;2023.2.9&#xff09;1.2 ChatGPT plugin1.3 LLaMA&#xff08;2023.2.24&#xff09;1.4 Visual ChatGPT&#xff08;2023.3.8&#xff09;1.5 GigaGAN&#xff08;2023.3.9&#xff09;1.6 Stanford Alpaca&#xff08;2…

面试官:详细说一下Java语言层面3种IO模型的实现

在Java中&#xff0c;一共有三种IO模型&#xff0c;分别是阻塞IO(BIO)、非阻塞IO(NIO)和异步IO(AIO)。 Linux五种IO模型和Java三种IO模型 Java BIO Java BIO就是Java的传统IO模型&#xff0c;对应了操作系统IO模型里的阻塞IO。 Java BIO相关的实现都位于java.io包下&#xf…

ECMA 各版本特性汇总

&#xff08;走运时,要想到倒霉&#xff0c;不要得意得过了头&#xff1b;倒霉时,要想到走运&#xff0c;不必垂头丧气。心态始终保持平衡&#xff0c;情绪始终保持稳定&#xff0c;此亦长寿之道。。——季羡林&#xff09; ECMA ecma官方网站 ecma github版本记录 w3schools …

由浅入深,聊聊OkHttp的那些事(易懂,不繁琐)

作者&#xff1a;Petterp 引言 在 Android 开发的世界中&#xff0c;有一些组件&#xff0c;无论应用层技术再怎么迭代&#xff0c;作为基础支持&#xff0c;它们依然在那里。 比如当我们提到网络库时&#xff0c;总会下意识想到一个名字&#xff0c;即 OkHttp 。 尽管对于大…

LVS和nginx和keepalived四层和7层的一些测试,nginx和keepalived共用环境的部署,lvs,nginx客户端IP透传

LVS和nginx的测试 实验DR模式 服务器IP备注mysql192.168.137.178测试服务器lvs**vip ** 192.168.137.99 RIP 192.168.137.100lvs服务器nginx1RIP 192.168.137.101nginx2RIP 192.168.137.102 LVS四层代理 test----lvs vip—nginx1/ngin2 LVS服务器的配置 [rootlvs openres…

Databend 开源周报第 92 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 在 WHERE 子句中…

算法记录 | Day56 动态规划

583.两个字符串的删除操作 思路&#xff1a; 1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义&#xff1a;dp[i][j]&#xff1a;以i-1为结尾的字符串word1&#xff0c;和以j-1位结尾的字符串word2&#xff0c;想要达到相等&#xff0c;所需要删除元素的最少次数…

别去外包,干了3年,彻底废了......

先说一下自己的情况。大专生&#xff0c;19年通过校招进入湖南某软件公司&#xff0c;干了接近3年的测试&#xff0c;今年年上旬&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了三年&#xff0c…

存储迁移到vSAN后将oracle rac的共享虚拟磁盘由“精简置备”转换为“厚置备快速置零”格式

在vSAN 6.5.0环境中&#xff0c;将Oracle RAC虚拟机的存储迁移到vSAN数据存储后&#xff0c;共享磁盘在迁移后全部变成了“精简置备”类型&#xff0c;如下所示&#xff1a; 注&#xff1a;从vSAN 6.7 Patch 01开始&#xff0c;vSAN上的Oracle RAC 不再要求共享的 VMDKs为厚置…

【论文阅读】COPA:验证针对中毒攻击的离线强化学习的稳健策略

COPA: Certifying Robust Policies for Offline Reinforcement Learning against Poisoning Attacks 作者&#xff1a;Fan Wu, Linyi Li, Chejian Xu 发表会议&#xff1a;2022ICRL 摘要 目前强化学习完成任务的水平已经和人类相接近&#xff0c;因此研究人员的目光开始转向…

Springboot Security 认证鉴权——使用JSON格式参数登录

在 Spring Security 中&#xff0c;默认的登陆方式是以表单形式进行提交参数的。可以参考前面的几篇文章&#xff0c;但是在前后端分离的项目&#xff0c;前后端都是以 JSON 形式交互的。一般不会使用表单形式提交参数。所以&#xff0c;在 Spring Security 中如果要使用 JSON …

Ansys Lumerical | 单行载流子光电探测器仿真方法

综述 在本例中&#xff0c;我们将研究混合硅基光电探测器的各项性能。单行载流子&#xff08;uni-traveling carrier&#xff0c;UTC&#xff09;光电探测器&#xff08;PD&#xff09;由InP/InGaAs制成&#xff0c;其通过渐变耦合的方式与硅波导相连。在本次仿真中&#xff0c…

04-Docker镜像

镜像 镜像是一种轻量级、可执行的独立软件包&#xff0c;它包含运行某个软件所需的所有内容&#xff0c;我们把应用程序和配置依赖打包好形成一个可交付的运行环境&#xff08;包括代码、运行时需要的库、环境变量和配置文件等&#xff09;&#xff0c;这个打包好的运行环境就是…

上海亚商投顾:沪指午后跳水跌超1% 两市超4000只个股下跌

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 沪指今日冲高回落&#xff0c;盘中一度站上3400点关口&#xff0c;午后跳水跌超1%&#xff0c;深成指、创业板指同…

本科生学数据分析转行,能学会吗?

当然可以&#xff0c;大专及以上都可以学习数据分析转行&#xff0c;本科学历学习更有优势。数据分析职业对于学历方面还是比较看重的&#xff0c;同样技能情况下&#xff0c;学历越高&#xff0c;入行薪资起点也会高个至少一两千&#xff1b;入行以后的升职加薪就看个人的能力…

vue3学习七 toRef 和 toRefs

toRef 和 ref 的作用差不多是一样的&#xff0c;都是可以把一个数据变成响应式的 我们一般使用toRef 或都 toRefs 是用来&#xff0c;简化 template 中的 数据的写法的&#xff0c; 使一个深层次的数据不用书写的时候那么麻烦。 如果不嫌麻烦的话&#xff0c; 这两个api 可以不…

尚硅谷-宋红康-JVM上中下篇完整笔记-JVM中篇

一.Class文件结构 1.概述 1.1 字节码文件的跨平台性 所有的JVM全部遵守Java虚拟机规范:Java SE Specifications&#xff0c;也就是说所有的JV环境都是一样的&#xff0c;这样一来字节码文件可以在各种JVM上运行。 1.2 Java的前端编译器 想要让一个Java程序正确地运行在JVM中&am…

安装Nacos

什么是Nacos 官网中如此说道&#xff1a; Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以…

CSS选择器的常见用法

文章目录 CSS是什么CSS的引入方式内部样式表行内样式表外部样式 选择器基础选择器类选择器id选择器通配符选择器 复合选择器后代选择器 CSS是什么 CSS就是&#xff08;Cascading Style Sheets&#xff09;就是层叠样式表&#xff0c;CSS 能够对网页中元素位置的排版进行像素级…

从项目到技能,软件测试面试高频题总结 (附答案),收割10个offer...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 软件测试面试题简历…