Java 8中的Stream API

Java 8引入了一种全新的数据处理方式:Stream。Stream API提供了一种功能强大、高效、可复合、并行处理集合数据的方式。使用Stream API,我们可以轻松地对集合进行筛选、排序、过滤、映射等操作。在本教程中,我们将深入介绍Stream API的原理、应用和示例代码。

什么是Stream

Stream是Java 8中的一个新概念,它可以看作是一种数据流,它本身并不存储数据,而是在对数据源进行处理时生成一连串的元素组成的流。这些元素可以是基本类型、对象、集合等。

Stream API主要包含以下两个接口:

  • Stream:表示一个元素序列,可以是基本类型、对象或者集合等。
  • IntStream、LongStream、DoubleStream:表示元素为基本类型int、long、double的序列。

Stream API提供了一种类似于SQL语句的查询机制,包括:过滤、映射、聚合等操作。

Stream API的核心思想是把集合中的数据转换为流,在流中对数据进行操作,然后再把流转换为集合。这个过程中,不需要对集合中的数据进行手动操作,而是通过Stream API提供的方法来完成。

一、Stream的基本操作

Stream API中的基本操作可以分为以下三类:

中间操作

中间操作可以对Stream进行转换、筛选、排序等操作,返回一个新的Stream对象。

中间操作可以分为以下几种:

  1. filter():根据条件过滤元素。
  2. map():对元素进行映射。
  3. flatMap():将多个流合并成一个流。
  4. distinct():去除重复元素。
  5. sorted():对元素进行排序。
  6. peek():对每个元素执行一个操作,但是不会修改流中的元素。
  7. limit():限制元素数量。
  8. skip():跳过指定数量的元素。
  9. parallel():将流转换为并行流,提高处理效率。

中止操作

中止操作是最终操作,它会生成一个结果或副作用。在执行中止操作后,Stream将无法再使用。

中止操作可以分为以下几种:

  1. forEach():对每个元素执行指定的操作。
  2. toArray():将元素转换为数组。
  3. reduce():对元素进行归约。
  4. collect():将元素收集到集合中。
  5. count():计算元素数量。
  6. anyMatch():判断是否有元素匹配给定的条件。
  7. allMatch():判断是否所有元素都匹配给定的条件。
  8. noneMatch():判断是否没有元素匹配给定的条件。
  9. findFirst():返回第一个元素。
  10. findAny():返回任意一个元素。

短路操作

短路操作是一种特殊的中止操作,当满足某些条件时,它们可以提前停止操作,不必遍历所有的元素。

短路操作可以分为以下几种:

  1. anyMatch():判断是否有元素匹配给定的条件。
  2. allMatch():判断是否所有元素都匹配给定的条件。
  3. noneMatch():判断是否没有元素匹配给定的条件。
  4. findFirst():返回第一个元素。
  5. findAny():返回任意一个元素。

二、Stream的使用示例

下面通过一些示例来演示Stream的使用。

过滤元素

假设有一个字符串列表,我们需要过滤掉所有长度小于3的字符串,并打印出剩下的字符串。可以使用filter()方法来过滤元素,代码如下:

List<String> list = Arrays.asList("java", "python", "scala", "c++", "c#");
list.stream().filter(s -> s.length() >= 3).forEach(System.out::println);

输出结果为:

java
python
scala
c++

映射元素

假设有一个字符串列表,我们需要把每个字符串转换为大写并打印出来。可以使用map()方法来映射元素,代码如下:

List<String> list = Arrays.asList("java", "python", "scala", "c++", "c#");
list.stream().map(String::toUpperCase).forEach(System.out::println);

输出结果为:

JAVA
PYTHON
SCALA
C++
C#

归约操作

假设有一个整数列表,我们需要计算它们的总和。可以使用reduce()方法来进行归约操作,代码如下:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int sum = list.stream().reduce(0, (a, b) -> a + b);
System.out.println(sum);

输出结果为:

15

统计元素

假设有一个整数列表,我们需要统计其中偶数的个数。可以使用filter()方法和count()方法来统计元素,代码如下:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
long count = list.stream().filter(i -> i % 2 == 0).count();
System.out.println(count);

输出结果为:

2

并行处理

Stream API还支持并行处理。在处理大量数据时,可以使用并行流来提高处理效率。下面是一个计算1到100的所有数字之和的例子,可以分别使用串行流和并行流来计算:

// 串行流
long sum1 = IntStream.rangeClosed(1, 100).reduce(0, (a, b) -> a + b);
System.out.println(sum1);// 并行流
long sum2 = IntStream.rangeClosed(1, 100).parallel().reduce(0, (a, b) -> a + b);
System.out.println(sum2);

输出结果为:

5050
5050

可以看到,使用并行流处理的时间更短。

Stream中的延迟执行

Stream API中的操作可以分为两种:中间操作和终端操作。中间操作返回的仍然是Stream对象,可以继续进行操作,而终端操作则返回一个非Stream类型的对象。

Stream中的操作是延迟执行的,也就是说,只有在执行终端操作时才会进行实际的计算。这种设计可以优化Stream的性能,例如可以避免对不必要的元素进行操作,或者可以合并多个操作以提高效率。

下面是一个示例,假设有一个字符串列表,我们需要将其中长度大于3的字符串转换为大写并打印出来。可以使用以下代码:

List<String> list = Arrays.asList("java", "python", "scala", "c++", "c#");
list.stream().filter(s -> s.length() > 3).map(String::toUpperCase).forEach(System.out::println);

输出结果为:

JAVA
PYTHON
SCALA

可以看到,只有满足filter()的条件才会执行map()操作,这种延迟执行的设计可以提高程序的性能。

三、Stream中的并行处理

Stream API提供了并行处理的支持,可以将一个流分成多个子流进行并行处理,从而提高处理效率。使用并行流处理数据时,需要注意以下几点:

  1. 并行流适合处理大量的数据。
  2. 处理有序数据时,会影响处理的效率。
  3. 处理数据时,需要确保没有竞争条件。

下面是一个示例,假设有一个整数列表,我们需要统计其中偶数的个数。可以使用以下代码:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
long count = list.parallelStream().filter(i -> i % 2 == 0).count();
System.out.println(count);

输出结果为:

5

可以看到,并行处理的效率比串行处理的效率更高。

四、总结

本文对Java 8中的Stream进行了介绍,包括Stream的概念、Stream的操作和Stream的特点。Stream是一种函数式编程的概念,可以方便地处理集合中的元素,并提供了多种操作方式。使用Stream API可以简化代码的编写,并提高程序的性能。

在使用Stream时,需要注意Stream的操作是延迟执行的,只有在执行终端操作时才会进行实际的计算。此外,Stream API还提供了并行处理的支持,可以将一个流分成多个子流进行并行处理,从而提高处理效率。在使用并行处理时,需要注意处理有序数据时,会影响处理的效率,并且需要确保没有竞争条件。

最后,我们再次强调Stream API的优点:Stream API可以简化代码的编写,并提高程序的性能。使用Stream API可以减少代码量,并提高代码的可读性。使用Stream API可以方便地对集合中的元素进行操作,并且可以提供多种操作方式。使用Stream API可以使用Lambda表达式来定义数据的处理方式,从而提高程序的可维护性。

示例代码

为了更好地理解Stream API的使用,本文提供了以下示例代码:

import java.util.Arrays;
import java.util.List;public class StreamDemo {public static void main(String[] args) {// 集合转换为Stream对象List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);list.stream().forEach(System.out::println);// 数组转换为Stream对象int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};Arrays.stream(arr).forEach(System.out::println);// 创建一个无限流Stream.iterate(0, n -> n + 2).limit(10).forEach(System.out::println);// 使用map操作转换Stream中的元素List<String> strList = Arrays.asList("java", "python", "scala", "c++", "c#");strList.stream().map(String::toUpperCase).forEach(System.out::println);// 使用filter操作过滤Stream中的元素List<Integer> numList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);numList.stream().filter(n -> n % 2 == 0).forEach(System.out::println);// 使用reduce操作对Stream中的元素进行归约int sum = numList.stream().reduce(0, (a, b) -> a + b);System.out.println(sum);// 使用并行流处理数据int sum2 = numList.parallelStream().reduce(0, (a, b) -> a + b);System.out.println(sum2);}}

参考文献

  1. Java 8 Stream API Documentation: ​​https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html​​

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

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

相关文章

虹科方案 | LIN/CAN总线汽车零部件测试方案

文章目录 摘要一、汽车零部件测试的重要性&#xff1f;二、虹科的测试仿真工具如何在汽车零部件测试展露头角&#xff1f;三、应用场景**应用场景1&#xff1a;方向盘开关的功能测试****应用场景2&#xff1a;各类型电机的控制测试****应用场景3&#xff1a;RGB氛围灯的功能测试…

CISSP,你值得拥有(我的学习之路)

&#xff08;只分享三点&#xff1a;怎么学、怎么练、怎么考。&#xff09; 我为啥去考CISSP 我是个在信安行业摸爬滚打将近20年的老油条&#xff0c;知道CISSP这个认证是很早前的事情了&#xff0c;但一直以来都觉得它有点难&#xff0c;加上人又懒得要命&#xff0c;也就始…

安装elasticsearch

1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器,因此需要让es和kibana容器互联。这里先创建一个网络: docker network create es-net 1.2.加载镜像 这里我们采用elasticsearch的7.12.1版本的镜像,这个镜像体积非常大,接近1G。不建议大家自己pull。 课前资料提…

用selenium和xpath定位元素并获取属性值以及str字符型转json型

页面html如图所示&#xff1a; 要使用xpath定位这个div元素&#xff0c;并且获取其属性data-config的内容值。 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Optionshost127.0.0.1 port10808 …

Serlet API详解

目录 一、HttpServlet 1.1 处理doGet请求 1.2 处理doPost请求 二、HttpServletRequest 2.1 核心方法 三、HttpServletRespons 3.1 核心方法 一、HttpServlet 在编写Servlet代码的时候&#xff0c;首先第一步要做的就是继承HttpServlet类&#xff0c;并重写其中的某些方法 核心…

最新ChatGPT网站系统源码+支持GPT4.0+支持AI绘画Midjourney绘画+支持国内全AI模型

一、SparkAI创作系统 SparkAi系统是基于很火的GPT提问进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT系统&#xff1f;小编这里写一个详细图文教程吧&a…

前端知识总结

在前端开发中&#xff0c;y x是一种常见的自增运算符的使用方式。它表示将变量x的值自增1&#xff0c;并将自增后的值赋给变量y。 具体来说&#xff0c;x是一种后缀自增运算符&#xff0c;表示将变量x的值自增1。而y x则是将自增前的值赋给变量y。这意味着在执行y x之后&am…

文件夹无法删除怎么办?4种实用方法,轻松解决

在日常使用电脑时&#xff0c;有时候会碰到无法删除文件夹的情况&#xff0c;这可能会带来一些困扰。如果你想删除一个文件夹却发现无法删除&#xff0c;不必担心&#xff0c;其实是有解决方法的。下面一起来了解下文件夹不能删除的原因以及解决方法吧。 文件夹为什么不能删除…

编程每日一练(多语言实现):判断偶数

文章目录 一、实例描述二、技术要点三、代码实现3.1 C 语言实现3.2 Python 语言实现3.3 Java 语言实现 一、实例描述 利用单条件单分支选择语句判断输入的一个整数 是否是偶数。 运行程序&#xff0c;输入一个 整数18&#xff0c; 然后按回车键&#xff0c;将提示该数字是偶数…

深入理解React中fiber

一、前言 Fiber是对React核心算法的重写&#xff0c;Fiber是React内部定义的一种数据结构&#xff0c;将更新渲染耗时长的大任务&#xff0c;分为许多的小片。Fiber节点保存啦组件需要更新的状态和副作用&#xff0c;一个Fiber代表一个工作单元。 二、Fiber在React做了什么 …

【文末送书】用Chat GPT轻松玩转机器学习与深度学习

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

华南理工大学电子与信息学院23年预推免复试面试经验贴

运气较好&#xff0c;复试分数90.24&#xff0c;电科学硕分数线84、信通83、专硕电子与信息74. 面试流程&#xff1a; 1&#xff1a;5min ppt的介绍。其中前2min用英语简要介绍基本信息&#xff0c;后3min可用英语也可用中文 介绍具体项目信息如大创、科研、竞赛等&#xff08…

Android 遍历界面所有的View

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、实践四、 推荐阅读 一、导读 我们…

linux使用操作[2]

文章目录 版权声明网络传输ping命令wget命令curl命令端口linux端口端口命令和工具 进程管理查看进程关闭进程 主机状态top命令内容详解磁盘信息监控 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明&#xff0c;所有版权属于黑马程序员或相…

MySQL - 全表分组后,获取组内排序首条数据信息

性能 不详!!! 不详!!! 不详!!! 请谨慎使用!!!环境 MySQL服务: 8.0版本;思路 使用8.0版本的新函数特性: row_number(): 序号函数; 顾名思义, 就是给每组中的元素从1开始按顺序加上序号;over(): 其中两个语法如下 partition: 按某字段分组;order by: 按某字段排序;注意: 两函数详…

算法通过村第十关-快排|白银笔记|快排实战

一个程序员一生中可能会邂逅各种各样的算法&#xff0c;但总有那么几种&#xff0c;是作为一个程序员一定会遇见且大概率需要掌握的算法。今天就来聊聊这些十分重要的“必抓&#xff01;”算法吧~ 文章目录 前言数组第K大总结 前言 这是快排中的经典算法题&#xff0c;但是很多…

数据库:Hive转Presto(一)

本人因为工作原因&#xff0c;经常使用hive以及presto&#xff0c;一般是编写hive完成工作&#xff0c;服务器原因&#xff0c;presto会跑的更快一些&#xff0c;所以工作的时候会使用presto验证结果&#xff0c;所以就要频繁hive转presto&#xff0c;为了方便&#xff0c;我用…

php函数usort使用方法

在 PHP 中&#xff0c;usort() 函数用于对数组进行排序&#xff0c;它允许你使用自定义的比较函数来确定元素的顺序。以下是 usort() 函数的使用方法&#xff1a; usort(array &$array, callable $cmp_function): bool参数说明&#xff1a; $array&#xff1a;要排序的数…

【新版】系统架构设计师 - 案例分析 - 架构设计<Web架构>

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 案例分析 - 架构设计&#xff1c;Web架构&#xff1e;Web架构知识点单台机器 到 数据库与Web服务器分离应用服务器集群负载均衡负载均衡技术静态与动态算法Session共享机制有状态与无状态 持久化技…

常用黑客指令【建议收藏】

系统信息 arch #显示机器的处理器架构(1) uname -m #显示机器的处理器架构(2) uname -r #显示正在使用的内核版本 dmidecode -q #显示硬件系统部件 - (SMBIOS / DMI) hdparm -i /dev/hda #罗列一个磁盘的架构特性 hdparm -tT /dev/sda #在磁盘上执行测试…