深入 Java Stream 流

news2025/1/22 16:42:58

目录

一、Stream 流是什么,为啥它如此重要

二、Stream 流的创建

1. 通过集合创建

2. 通过数组创建

3. 使用 Stream.of () 方法

三、Stream 流的中间操作

1. 过滤(filter)

2. 映射(map)

3. 排序(sorted)

四、Stream 流的终端操作

1. 收集(collect)

2. 聚合(reduce)

3. 查找(findFirst、findAny 等)

五、并行流的应用

六、总结


在 Java 编程的领域中,Stream 流可谓是一项令人瞩目的特性,它为我们处理集合数据带来了全新的思路与高效的方式。Stream 流就像是一条数据处理的 “流水线”,让我们能够以一种简洁、声明式的风格对数据进行筛选、转换、聚合等操作。今天,咱们就一起深入探究 Java 的 Stream 流,通过丰富的代码示例来领略它的强大魅力。

一、Stream 流是什么,为啥它如此重要

想象一下,你有一堆杂乱无章的物品,需要对它们进行分类、筛选、统计等一系列操作。以往,我们可能需要编写冗长的循环代码来实现这些功能,不仅繁琐,而且容易出错。而 Stream 流就像是一个智能的 “助手”,它能够帮我们更优雅、更高效地完成这些任务。

Java 8 引入的 Stream 流,本质上是对集合数据进行函数式操作的一种抽象。它允许我们以一种类似于 SQL 语句的方式来处理集合数据,将数据处理逻辑与数据本身分离,使代码更加简洁、易读。通过 Stream 流,我们可以轻松地实现对集合的过滤、映射、排序、聚合等常见操作,大大提高了代码的可读性和可维护性。

二、Stream 流的创建

在使用 Stream 流之前,我们首先要学会如何创建它。Stream 流的创建方式多种多样,下面为大家介绍几种常见的创建方式。

1. 通过集合创建

Java 中的集合类都提供了stream()方法来创建一个顺序流,以及parallelStream()方法来创建一个并行流。并行流利用多核 CPU 的优势,能够同时处理多个数据元素,提高处理效率。

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

public class StreamFromCollectionExample {
    public static void main(String[] args) {
        List<Integer> numbers = new ArrayList<>();
        numbers.add(1);
        numbers.add(2);
        numbers.add(3);
        numbers.add(4);
        numbers.add(5);

        // 创建顺序流
        Stream<Integer> sequentialStream = numbers.stream();

        // 创建并行流
        Stream<Integer> parallelStream = numbers.parallelStream();
    }
}

2. 通过数组创建

我们可以使用Arrays.stream()方法将数组转换为 Stream 流。

import java.util.Arrays;
import java.util.stream.Stream;

public class StreamFromArrayExample {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3, 4, 5};
        Stream<int[]> streamOfArrays = Stream.of(numbers);

        // 对于基本类型数组,也可以使用专门的方法
        IntStream intStream = Arrays.stream(numbers);
    }
}

3. 使用 Stream.of () 方法

Stream.of()方法可以直接将一组元素转换为 Stream 流。

import java.util.stream.Stream;

public class StreamOfExample {
    public static void main(String[] args) {
        Stream<String> stringStream = Stream.of("apple", "banana", "cherry");
    }
}

三、Stream 流的中间操作

Stream 流提供了一系列的中间操作,这些操作会返回一个新的 Stream 流,并且可以将多个中间操作串联起来,形成一个操作链。常见的中间操作包括过滤、映射、排序等。

1. 过滤(filter)

filter操作可以根据给定的条件筛选出符合条件的元素。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

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

        List<Integer> evenNumbers = numbers.stream()
              .filter(n -> n % 2 == 0)
              .collect(Collectors.toList());

        System.out.println("偶数: " + evenNumbers);
    }
}

在上述代码中,我们使用filter方法筛选出了列表中的偶数。

2. 映射(map)

map操作可以将 Stream 流中的每个元素按照指定的函数进行转换。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StreamMapExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

        List<Integer> squaredNumbers = numbers.stream()
              .map(n -> n * n)
              .collect(Collectors.toList());

        System.out.println("平方后的数字: " + squaredNumbers);
    }
}

这里我们使用map方法将列表中的每个数字转换为其平方。

3. 排序(sorted)

sorted操作可以对 Stream 流中的元素进行排序。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StreamSortedExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(5, 3, 1, 4, 2);

        List<Integer> sortedNumbers = numbers.stream()
              .sorted()
              .collect(Collectors.toList());

        System.out.println("排序后的数字: " + sortedNumbers);
    }
}

在这个例子中,我们对列表中的数字进行了升序排序。如果需要降序排序,可以使用sorted(Comparator.reverseOrder())

四、Stream 流的终端操作

终端操作会消费 Stream 流,执行中间操作链,并返回一个结果。常见的终端操作包括收集、聚合、查找等。

1. 收集(collect)

collect操作可以将 Stream 流中的元素收集到一个集合中,或者进行其他形式的汇总。

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class StreamCollectExample {
    public static void main(String[] args) {
        List<String> fruits = new ArrayList<>();
        fruits.add("apple");
        fruits.add("banana");
        fruits.add("cherry");

        List<String> upperCaseFruits = fruits.stream()
              .map(String::toUpperCase)
              .collect(Collectors.toList());

        System.out.println("转换为大写后的水果列表: " + upperCaseFruits);
    }
}

在上述代码中,我们将水果列表中的每个元素转换为大写,并收集到一个新的列表中。

2. 聚合(reduce)

reduce操作可以对 Stream 流中的元素进行聚合操作,例如求和、求积等。

import java.util.Arrays;
import java.util.List;

public class StreamReduceExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

        int sum = numbers.stream()
              .reduce(0, (a, b) -> a + b);

        System.out.println("数字之和: " + sum);
    }
}

这里我们使用reduce方法对列表中的数字进行求和,初始值为 0。

3. 查找(findFirst、findAny 等)

findFirst操作可以返回 Stream 流中的第一个元素,findAny操作可以返回 Stream 流中的任意一个元素(在并行流中,findAny可能会返回更高效的结果)。

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

public class StreamFindExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

        Optional<Integer> firstNumber = numbers.stream()
              .findFirst();

        firstNumber.ifPresent(System.out::println);
    }
}

在上述代码中,我们使用findFirst方法获取列表中的第一个元素,并通过ifPresent方法进行处理,避免了空指针异常。

五、并行流的应用

并行流利用多核 CPU 的优势,可以显著提高大数据集的处理效率。在使用并行流时,只需要将stream()方法替换为parallelStream()方法即可。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

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

        List<Integer> squaredNumbers = numbers.parallelStream()
              .map(n -> n * n)
              .collect(Collectors.toList());

        System.out.println("并行处理后的平方数字: " + squaredNumbers);
    }
}

需要注意的是,并行流并不适用于所有场景,在处理小数据集或者存在共享资源的情况下,并行流可能会因为线程调度等开销而降低性能。因此,在实际应用中,需要根据具体情况进行权衡。

六、总结

通过今天的学习,我们深入了解了 Java 的 Stream 流,从它的创建方式,到丰富的中间操作和终端操作,以及并行流的应用。Stream 流为我们提供了一种简洁、高效的方式来处理集合数据,让代码更加优雅、易读。在实际编程中,合理运用 Stream 流能够大大提高开发效率,减少代码量,同时充分发挥多核 CPU 的性能优势。希望大家在今后的 Java 编程中,能够熟练掌握并运用 Stream 流,为自己的代码注入新的活力。如果在学习过程中遇到任何问题,欢迎随时交流,让我们一起在 Java 编程的道路上不断探索前行。

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

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

相关文章

CAN 网络介绍

背景 在T-Box 产品开发过程中&#xff0c;我们离不开CAN总线&#xff0c;因为CAN总线为我们提供了车身的相关数据&#xff0c;比如&#xff0c;车速、油耗、温度等。用于上报TSP平台&#xff0c;进行国标认证&#xff1b;也帮助我们进行车身控制&#xff0c;比如车门解锁/闭锁…

【C++】在线五子棋对战项目网页版

目录 1.Websocket 1.1.Websocket的简单认识 1.2.什么是轮询呢&#xff1f; 1.3.websocket协议切换过程 1.4.websocketpp库常用接口认识 1.5.websocketpp库搭建服务器流程 1.6.websocketpp库搭建服务器 2.mysqlclient库-接口认识 3.项目模块的划分&#xff1a; 4.项目…

《鸿蒙 HarmonyOS 应用开发从入门到精通(第 2 版)》学习笔记 ——HarmonyOS 环境搭建之安装DevEco Studio

作为一款开发工具&#xff0c;除了具有基本的代码开发、编译构建及调测等功能外&#xff0c;DevEco Studio还具有如下特点&#xff1a; 高效智能代码编辑&#xff1a;支持Java、XML、ArkTS、JS、C/C等语言的代码高亮、代码智能补齐、代码错误检查、代码自动跳转、代码格式化、…

2025年最新深度学习环境搭建:Win11+ cuDNN + CUDA + Pytorch +深度学习环境配置保姆级教程

本文目录 一、查看驱动版本1.1 查看显卡驱动1.2 显卡驱动和CUDA对应版本1.3 Pytorch和Python对应的版本1.4 Pytorch和CUDA对应的版本 二、安装CUDA三、安装cuDANN四、安装pytorch五、验证是否安装成功 一、查看驱动版本 1.1 查看显卡驱动 输入命令nvidia-smi可以查看对应的驱…

LAYA3.0 组件装饰器说明

原文 在LayaAirIDE中&#xff0c;如果想在IDE内展示组件脚本的属性&#xff0c;需要通过装饰器的规则来实现。下面分别介绍四种装饰器。 文章目录 一、regClass()二、property()2.1 组件属性的常规使用2.2 属性访问器的装饰器使用2.3 是否序列化保存2.4 组件属性是否在IDE中显…

PostIn安装教程

PostIn是一款国产开源免费的接口管理工具&#xff0c;包含项目管理、接口调试、接口文档设计、接口数据MOCK等模块&#xff0c;支持常见的HTTP协议、websocket协议等&#xff0c;支持免登陆本地接口调试&#xff0c;同时可以对项目进行灵活的成员权限、消息通知管理等。 1、服务…

RabbitMQ--延迟队列

&#xff08;一&#xff09;延迟队列 1.概念 延迟队列是一种特殊的队列&#xff0c;消息被发送后&#xff0c;消费者并不会立刻拿到消息&#xff0c;而是等待一段时间后&#xff0c;消费者才可以从这个队列中拿到消息进行消费 2.应用场景 延迟队列的应用场景很多&#xff0c;…

后端面试题分享第一弹(状态码、进程线程、TCPUDP)

后端面试题分享第一弹 1. 如何查看状态码&#xff0c;状态码含义 在Web开发和调试过程中&#xff0c;HTTP状态码是了解请求处理情况的重要工具。 查看状态码的步骤 打开开发者工具&#xff1a; 在大多数浏览器中&#xff0c;您可以通过按下 F12 键或右键单击页面并选择“检查…

网络通信---MCU移植LWIP

使用的MCU型号为STM32F429IGT6&#xff0c;PHY为LAN7820A 目标是通过MCU的ETH给LWIP提供输入输出从而实现基本的Ping应答 OK废话不多说我们直接开始 下载源码 LWIP包源码&#xff1a;lwip源码 -在这里下载 ST官方支持的ETH包&#xff1a;ST-ETH支持包 这里下载 创建工程 …

CSS笔记基础篇02——浮动、标准流、定位、CSS精灵、字体图标

黑马程序员视频地址&#xff1a; 前端Web开发HTML5CSS3移动web视频教程https://www.bilibili.com/video/BV1kM4y127Li?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p70https://www.bilibili.com/video/BV1kM4y127Li?vd_source…

Linux:进程(三)

1. 进程创建补充 fork之后父子两个执行流分别执行&#xff0c;fork之后谁谁先执行由调度器来决定。 一般&#xff0c;父子代码共享。当父子不再写入时&#xff0c;数据也是共享的&#xff0c;但是当有一方要写入&#xff0c;就触发写时拷贝。 fork调用失败的原因 1. 系统中有…

2025年1月21日刷题记录

1.leetcode1768题目 链接&#xff1a;1768. 交替合并字符串 - 力扣&#xff08;LeetCode&#xff09; 代码&#xff1a; class Solution { public:string mergeAlternately(string word1, string word2) {string word3;int a word1.size(), b word2.size();int i 0, j 0…

Mysql触发器(学习自用)

一、介绍 二、触发器语法 注意&#xff1a;拿取新的数据时用new&#xff0c;旧数据用old。

wireshark工具简介

目录 1 wireshark介绍 2 wireshark抓包流程 2.1 选择网卡 2.2 停止抓包 2.3 保存数据 3 wireshark过滤器设置 3.1 显示过滤器的设置 3.2 抓包过滤器 4 wireshark的封包列表与封包详情 4.1 封包列表 4.2 封包详情 参考文献 1 wireshark介绍 wireshark是非常流行的网络…

「2024·我的成长之路」:年终反思与展望

文章目录 1. 前言2.创作历程2.1 摆烂期2.2 转变期3. 上升期 2. 个人收获3.经验分享4. 展望未来 1. 前言 2025年1月16日&#xff0c;2024年博客之星入围公布&#xff0c;很荣幸获得了这次入围的机会。2024年对我个人是里程碑的一年&#xff0c;是意义非凡的一年&#xff0c;是充…

【RAG落地利器】向量数据库Chroma入门教程

安装部署 官方有pip安装的方式&#xff0c;为了落地使用&#xff0c;我们还是采用Docker部署的方式&#xff0c;参考链接来自官方部署: https://cookbook.chromadb.dev/running/running-chroma/#docker-compose-cloned-repo 我们在命令终端运行&#xff1a; docker run -d --…

电阻电位器可调电阻信号隔离变送器典型应用

电阻电位器可调电阻信号隔离变送器典型应用 产品描述&#xff1a; 深圳鑫永硕科技的XYS-5587系列是一进一出线性电子尺(电阻/电位计信号及位移)信号隔离变送器&#xff0c;是将输入电阻,线性电子尺,角度位移传感器信号进行采集,隔离,放大并转换成模拟量信号的小型仪表设备,并以…

[创业之路-259]:《向流程设计要效率》-1-让成功成熟业务交给流程进行复制, 把创新产品新业务新客户交给精英和牛人进行探索与创造

标题&#xff1a;成功与创新的双轨并行&#xff1a;以流程复制成熟&#xff0c;以精英驱动新知 在当今这个日新月异的商业环境中&#xff0c;企业要想持续繁荣发展&#xff0c;就必须在稳定与创新之间找到完美的平衡点。一方面&#xff0c;成熟业务的稳定运营是企业生存和发展的…

模拟飞行入坑(五) P3D 多通道视角配置 viewgroup

背景&#xff1a; P3D进行多个屏幕显示的时候&#xff0c;如果使用英伟达自带的屏幕融合成一个屏&#xff0c;或者使用P3D单独拉伸窗口&#xff0c;会使得P3D的画面被整体拉伸&#xff0c;又或者,当使用Multichannel进行多个设备联动时&#xff0c;视角同步组合需要配置&#…

Java中的错误与异常详解

Java中的错误与异常详解 Java提供了一种机制来捕获和处理程序中的异常和错误。异常和错误都继承自 Throwable 类&#xff0c;但它们有着不同的用途和处理方式。 1. Error&#xff08;错误&#xff09; Error 是程序无法处理的严重问题&#xff0c;通常由 JVM&#xff08;Java…