巧用Java 8 Stream流简化集合操作

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 本文详解Java 8 Stream API如何简化集合操作:通过filter筛选、map转换、collect收集等声明式方法,一行代码替代冗长for循环。以成年用户处理为例,对比传统写法,突出Stream在可读性、简洁性与可维护性上的显著优势。(239字)

在Java开发中,集合处理是日常高频操作。传统的for循环遍历、筛选、转换不仅代码冗余,可读性也差。Java 8引入的Stream流(Stream API)能以声明式的方式处理集合,让代码更简洁、易维护。本文通过简单示例,带你快速上手Stream流的核心用法。

场景说明

假设我们有一个用户列表,需要完成三个常见操作:

  1. 筛选出年龄大于18岁的成年用户;
  2. 提取这些用户的姓名并拼接成字符串;
  3. 统计成年用户的数量。

传统循环实现

先看传统for循环的写法,感受一下冗余的代码:

import java.util.ArrayList;
import java.util.List;

// 定义用户实体类
class User {
   
    private String name;
    private int age;

    // 构造方法
    public User(String name, int age) {
   
        this.name = name;
        this.age = age;
    }

    // getter方法
    public String getName() {
   
        return name;
    }

    public int getAge() {
   
        return age;
    }
}

public class StreamDemo {
   
    public static void main(String[] args) {
   
        // 初始化用户列表
        List<User> userList = new ArrayList<>();
        userList.add(new User("张三", 20));
        userList.add(new User("李四", 17));
        userList.add(new User("王五", 25));
        userList.add(new User("赵六", 16));

        // 传统方式:筛选成年用户、提取姓名、统计数量
        List<String> adultNames = new ArrayList<>();
        int adultCount = 0;
        for (User user : userList) {
   
            if (user.getAge() > 18) {
    // 筛选条件
                adultNames.add(user.getName()); // 提取姓名
                adultCount++; // 统计数量
            }
        }

        // 拼接姓名
        String nameStr = String.join(", ", adultNames);
        System.out.println("成年用户姓名:" + nameStr);
        System.out.println("成年用户数量:" + adultCount);
    }
}

Stream流实现

用Stream流重构后,代码更简洁,逻辑更清晰:

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

// 复用上面的User实体类
public class StreamOptDemo {
   
    public static void main(String[] args) {
   
        // 初始化用户列表
        List<User> userList = new ArrayList<>();
        userList.add(new User("张三", 20));
        userList.add(new User("李四", 17));
        userList.add(new User("王五", 25));
        userList.add(new User("赵六", 16));

        // Stream流方式:一站式完成筛选、转换、统计
        // 1. 筛选成年用户并提取姓名
        List<String> adultNames = userList.stream()
                .filter(user -> user.getAge() > 18) // 筛选条件:年龄>18
                .map(User::getName) // 提取姓名(方法引用)
                .collect(Collectors.toList()); // 转换为List

        // 2. 统计成年用户数量
        long adultCount = userList.stream()
                .filter(user -> user.getAge() > 18)
                .count(); // 直接统计数量

        // 3. 拼接姓名
        String nameStr = adultNames.stream().collect(Collectors.joining(", "));

        System.out.println("成年用户姓名:" + nameStr);
        System.out.println("成年用户数量:" + adultCount);
    }
}

代码解释

  1. stream():将集合转换为Stream流,开启流式操作;
  2. filter():接收Lambda表达式作为筛选条件,只保留符合条件的元素;
  3. map():对元素进行转换,这里通过User::getName(方法引用)提取用户姓名;
  4. collect():将流转换为指定集合(如Collectors.toList())或拼接字符串(Collectors.joining());
  5. count():统计流中元素的数量,返回long类型。

运行结果

两种写法的运行结果一致:

成年用户姓名:张三, 王五
成年用户数量:2

总结

  1. Stream流以声明式编程替代传统命令式循环,代码更简洁、可读性更高;
  2. 核心方法filter()(筛选)、map()(转换)、collect()(收集)是Stream流的高频用法;
  3. Stream流支持链式调用,可一站式完成多步集合操作,减少中间变量的定义。

Stream流不仅能简化集合操作,还支持并行流(parallelStream())提升大数据量处理效率,是Java 8及以上版本必备的核心技能。

相关文章
|
27天前
|
人工智能 Oracle 小程序
AI编码时代:代码已不再“昂贵”,低代码会不会成为一堆垃圾?
低代码一度是企业软件行业最火爆的概念之一。不管是国内还是国外,低代码都是行业领头羊的标配。比如,国外的Microsoft Corporation、Oracle、Salesforce,国内的金蝶、用友、北森等。但随着各种AI大模型的问世,低代码的消息似乎很少再听到了。这是为什么?今天老纪来和大家深入聊聊这个话题。
|
1月前
|
人工智能 搜索推荐 关系型数据库
PolarDB 推出为 AI Agent 构建专属长效记忆的托管服务
智能体(AI Agent)应用的核心挑战之一是其健忘的特性,无法记住历史交互、用户偏好或长期上下文。PolarDB PostgreSQL 版和 PolarDB MySQL 版现推出为 AI Agent 构建专属长效记忆的托管服务,让您的 AI 应用记住一切,从而构建更智能、更具个性化的用户体验。
|
19天前
|
SQL 人工智能 自然语言处理
我用DataClaw打造了一个7X24小时的数据助理
阿里云DMS DataClaw是7×24小时AI数据助理,支持自然语言提工单、智能巡检、多任务编排、SQL风险预审等9项硬功能,原生集成DMS安全体系,覆盖MySQL/Oracle等60+数据源。现在可免费试用,快来体验吧。
572 9
|
1月前
|
人工智能 API 机器人
OpenClaw 用户部署和使用指南汇总
本文档为OpenClaw(原MoltBot)官方使用指南,涵盖一键部署(阿里云轻量服务器年仅68元)、钉钉/飞书/企微等多平台AI员工搭建、典型场景实践及高频问题FAQ。同步更新产品化修复进展,助力用户高效落地7×24小时主动执行AI助手。
22568 146
|
17天前
|
开发者 索引 Python
Python技巧:提升代码效率的五个实用技巧
Python技巧:提升代码效率的五个实用技巧
303 136
|
24天前
|
存储 Java
java synchronized 锁升级:从偏向锁到重量级锁的底层自适应优化
`synchronized` 是Java核心同步机制,JDK 1.6起引入锁升级(无锁→偏向锁→轻量级锁→重量级锁),依托对象头Mark Word动态适配竞争强度,兼顾性能与稳定性,是并发编程必懂的底层逻辑。(239字)
171 8
|
14天前
|
存储 缓存 Java
Java 对象内存布局:从堆内存储到伪共享优化的底层真相
Java对象内存布局是JVM核心基础:含对象头(Mark Word+Klass指针)、实例数据(字段重排序优化)和对齐填充(8字节对齐)。它直接影响内存占用、GC效率、锁升级与伪共享性能。掌握此机制,是深入理解并发优化(如@Contended)、指针压缩及高性能编程的必经之路。(239字)
257 111
|
16天前
|
存储 C语言 内存技术
C语言深度解析:大小端字节序——多字节数据的底层存储规则
大小端指CPU对多字节数据在内存中的存放顺序:大端高字节存低地址,小端反之。x86/ARM默认小端,网络字节序统一为大端。跨平台、网络通信、二进制协议开发中必须显式处理字节序转换,否则数据解析必错。
477 138
|
14天前
|
存储 安全 编译器
C语言深度解析:变长数组(VLA)的底层逻辑与避坑指南
变长数组(VLA)是C99引入的栈上动态数组,长度运行时确定,访问快但无安全检查。易致栈溢出、野指针、跨平台兼容问题,仅适用于小尺寸、短生命周期场景,大数组务必用malloc。
212 38
|
4天前
|
存储 安全 编译器
C语言「存储期四象限」:变量生死的底层宪法,90%内存bug的根源
本文深入剖析C语言四大存储期(静态、自动、分配、线程),揭示“变量消失”“指针错乱”“内存泄漏”等顽疾的根源——**访问了生命周期已结束的内存**。用四象限模型厘清变量生死规则,助你从底层杜绝90%内存bug。(239字)
74 15