首页 > 编程语言 >Java中的高效集合操作:Stream API实战指南

Java中的高效集合操作:Stream API实战指南

时间:2025-01-15 23:57:00浏览次数:3  
标签:Java Stream stream Python List C++ API

Java中的高效集合操作:Stream API实战指南

1. 引言:集合操作的痛点

在日常开发中,我们经常需要对集合进行各种操作,比如过滤、映射、排序、聚合等。传统的做法是使用for循环或Iterator,代码冗长且容易出错。比如:

List<String> names = new ArrayList<>();
for (User user : users) {
    if (user.getAge() > 18) {
        names.add(user.getName().toUpperCase());
    }
}

这样的代码不仅难以维护,还容易引入bug。幸运的是,Java 8引入了Stream API,它提供了一种更高效、更优雅的方式来处理集合数据。


2. Stream API简介

Stream是Java 8中新增的一个抽象层,它允许我们以声明式的方式处理数据集合。Stream的核心思想是将数据操作分为中间操作(Intermediate Operations)和终端操作(Terminal Operations)。

  • 中间操作:返回一个新的Stream,可以链式调用(如filtermapsorted)。
  • 终端操作:触发实际计算并返回结果(如collectforEachreduce)。

3. Stream的常用操作

3.1 创建Stream
  • 从集合创建:

    List<String> list = Arrays.asList("Java", "Python", "C++");
    Stream<String> stream = list.stream();
    
  • 从数组创建:

    String[] array = {"Java", "Python", "C++"};
    Stream<String> stream = Arrays.stream(array);
    
  • 使用Stream.of创建:

    Stream<String> stream = Stream.of("Java", "Python", "C++");
    
3.2 过滤数据(filter)

filter用于过滤符合条件的元素。

List<String> languages = Arrays.asList("Java", "Python", "C++", "JavaScript");
List<String> result = languages.stream()
                               .filter(lang -> lang.startsWith("J"))
                               .collect(Collectors.toList());
// 结果:["Java", "JavaScript"]
3.3 映射数据(map)

map用于将元素转换为另一种形式。

List<String> languages = Arrays.asList("Java", "Python", "C++");
List<Integer> lengths = languages.stream()
                                 .map(String::length)
                                 .collect(Collectors.toList());
// 结果:[4, 6, 3]
3.4 排序数据(sorted)

sorted用于对元素进行排序。

List<String> languages = Arrays.asList("Java", "Python", "C++");
List<String> sorted = languages.stream()
                               .sorted()
                               .collect(Collectors.toList());
// 结果:["C++", "Java", "Python"]
3.5 聚合数据(reduce)

reduce用于将流中的元素聚合成一个结果。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
                 .reduce(0, Integer::sum);
// 结果:15

4. Stream的高级操作

4.1 去重(distinct)

distinct用于去除重复元素。

List<String> languages = Arrays.asList("Java", "Python", "Java", "C++");
List<String> unique = languages.stream()
                               .distinct()
                               .collect(Collectors.toList());
// 结果:["Java", "Python", "C++"]
4.2 扁平化(flatMap)

flatMap用于将嵌套的流扁平化。

List<List<String>> nested = Arrays.asList(
    Arrays.asList("Java", "Python"),
    Arrays.asList("C++", "JavaScript")
);
List<String> flat = nested.stream()
                          .flatMap(List::stream)
                          .collect(Collectors.toList());
// 结果:["Java", "Python", "C++", "JavaScript"]
4.3 分组(groupingBy)

groupingBy用于根据某个条件对元素进行分组。

List<String> languages = Arrays.asList("Java", "Python", "C++", "JavaScript");
Map<Integer, List<String>> grouped = languages.stream()
                                              .collect(Collectors.groupingBy(String::length));
// 结果:{3=["C++"], 4=["Java"], 6=["Python"], 10=["JavaScript"]}

5. 实战案例:用户数据处理

5.1 需求描述

假设我们有一个User列表,每个User包含nameage字段。我们需要:

  1. 过滤出年龄大于18的用户。
  2. 将用户名转换为大写。
  3. 按用户名排序。
  4. 返回前5个用户的名字。
5.2 传统实现
List<User> users = getUsers();
List<String> result = new ArrayList<>();
for (User user : users) {
    if (user.getAge() > 18) {
        result.add(user.getName().toUpperCase());
    }
}
result.sort(String::compareTo);
if (result.size() > 5) {
    result = result.subList(0, 5);
}
5.3 使用Stream API实现
List<String> result = users.stream()
                           .filter(user -> user.getAge() > 18)
                           .map(user -> user.getName().toUpperCase())
                           .sorted()
                           .limit(5)
                           .collect(Collectors.toList());

6. 总结

Stream API是Java中处理集合数据的利器,它让我们的代码更加简洁、易读,同时提高了开发效率。通过掌握Stream的常用操作和高级特性,我们可以轻松应对各种复杂的数据处理需求。

标签:Java,Stream,stream,Python,List,C++,API
From: https://blog.csdn.net/m0_37825219/article/details/145170415

相关文章

  • Java异常
    什么是异常异常的捕获与抛出trycatchfinally的使用publicclassTest{publicstaticvoidmain(String[]args){inta=1;intb=0;try{//try监控区域System.out.println(a/b);}catch(ArithmeticExce......
  • 【Java开发】实现 License 认证(只校验有效期)
    一、License介绍License也就是版权许可证书,一般用于收费软件给付费用户提供的访问许可证明1.1应用场景应用部署在客户的内网环境这种情况开发者无法控制客户的网络环境,也不能保证应用所在服务器可以访问外网因此通常的做法是使用服务器许可文件,在应用启动的时候加载证书然......
  • 【Java安全】浅谈内存马
    一、内存马概述1.1内存马产生的背景1.2Java内存马的基本原理1.3Java内存马的类型1.4Java内存马的使用场景二、内存马注入实战演示2.1JSP注入Filter内存马2.2Fastjson反序列化注入内存马2.3注入Agent内存马三、内存马的检测与防御......
  • java学习第二天
    Hello~Hello,World!(代码入门第一个代码)随便新建一个文件夹,存放代码新建一个Java文件文件后缀名为.javaHello.java【注意点】系统可能没有显示文件后缀名,需要手动打开,首先点击查看然后再在里面的显示给文件扩展名打钩就可以看到文件的后缀名了编写程序在文件夹地......
  • JAVA开源毕业设计 中药实验管理系统 Vue.JS+SpringBoot+MySQL
    本文项目编号T130,文末自助获取源码\color{red}{T130,文末自助获取源码}......
  • JAVA开源毕业设计 网上商城系统 Vue.JS+SpringBoot+MySQL
    本文项目编号T129,文末自助获取源码\color{red}{T129,文末自助获取源码}......
  • JAVA开源毕业设计 编程训练系统 Vue.JS+SpringBoot+MySQL
    本文项目编号T128,文末自助获取源码\color{red}{T128,文末自助获取源码}......
  • 【JavaSecLab靶场】Java综合漏洞平台
    免责声明:请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。在我们平时的网络安全工作中,经常会面对各种各样的挑战。比如,进行定期的漏洞扫描、代码审计,甚至是参与红蓝对抗演练时,发现漏洞后往往需要及时将其修复。最近,我接触到了一款开源的网络安全工......
  • Java-exp5
    目录(1) 实验流程图(软件设计简易流程图+每个按钮添加监听Event,画出监听程序设计流程图)(2)页面布局设计图 (3)实验源代码(粘贴源代码):SimpleCalculator.java ScienceCalculator.javaBaseConverter.javaDrawFn.java(4)实验代码、过程、相应结果(截图)并对实验进行说明和分......
  • JavaWeb课后笔记及体会分享(每日一更)
           从今天开始学习JavaWeb,在接下来的时间里我将学习JavaSE,MySQL,Web前端,JavaEE,SSM三大框架,SpainBoot,SpringCloud,以及一些常见面试题的练习。1.IDEA常用快捷键  Shift两次:包含各种文件、方法的搜索Ctrl+Shift+F:根据输入内容查找整个项目或指定目录内文件......