利用 JDK 17 的 Stream API 实现高效数据处理

news/2025/1/31 9:20:49/

在 Java 开发领域,随着 JDK 的不断演进,Stream API 已然成为处理集合数据的强大工具,尤其是在 JDK 17 中,它为我们带来了更便捷、高效的数据处理方式。

一、Stream API 简介

Stream API 提供了一种函数式编程风格来操作集合数据,它允许我们以声明式的方式处理数据,而非传统的命令式迭代。简单来说,我们可以用简洁的代码表达复杂的数据转换、过滤和聚合操作。

二、基础使用示例

首先,假设我们有一个包含多个整数的 List:

import java.util.ArrayList;

import java.util.List;

public class StreamExample {

public static void main(String[] args) {

List<Integer> numbers = new ArrayList<>();

numbers.add(1);

numbers.add(5);

numbers.add(3);

numbers.add(8);

numbers.add(2);

// 使用 Stream API 过滤出偶数

List<Integer> evenNumbers = numbers.stream()

.filter(num -> num % 2 == 0)

.toList();

System.out.println(evenNumbers);

}

}

在上述代码中,我们通过 stream() 方法将 List 转换为流,接着使用 filter 操作,仅保留满足条件(是偶数)的元素,最后通过 toList 方法将流转换回 List。整个过程清晰简洁,无需繁琐的循环迭代。

三、JDK 17 中的新特性增强

在 JDK 17 中,Stream API 有一些令人瞩目的改进。例如,对 toList 方法的支持更加直接,像上述示例中,不再需要额外导入 Collectors 类来使用 collect(Collectors.toList()),简化了代码结构。

另外,在处理并行流时,性能也有一些优化。假设我们有一个大规模的数据集,想要快速计算所有元素的总和:

import java.util.ArrayList;

import java.util.List;

public class ParallelStreamExample {

public static void main(String[] args) {

List<Integer> largeNumbers = new ArrayList<>();

// 假设这里填充了大量整数

int sum = largeNumbers.parallelStream()

.mapToInt(Integer::intValue)

.sum();

System.out.println("总和为: " + sum);

}

}

通过 parallelStream,JDK 17 能更智能地利用多核处理器,在大数据集场景下显著提升计算效率。

四、复杂业务逻辑案例分享

案例一:电商订单处理

在电商系统中,我们常常需要对订单数据进行多维度的分析。假设有一个 Order 类,包含订单号、客户 ID、订单金额、订单日期等属性,存储在一个 List<Order> 中。

class Order {

private String orderId;

private int customerId;

private double amount;

localDate orderDate;

// 构造函数、getter 和 setter 省略

}

现在要找出某个特定客户在过去一个月内的订单总金额:

import java.time.LocalDate;

import java.util.ArrayList;

import java.util.List;

public class EcommerceExample {

public static void main(String[] args) {

List<Order> orders = new ArrayList<>();

// 假设这里填充了一些订单数据

int targetCustomerId = 123;

LocalDate oneMonthAgo = LocalDate.now().minusMonths(1);

double totalAmount = orders.stream()

.filter(order -> order.getCustomerId() == targetCustomerId && order.getOrderDate().isAfter(oneMonthAgo))

.mapToDouble(Order::getAmount)

.sum();

System.out.println("该客户过去一个月订单总金额: " + totalAmount);

}

}

在这段代码中,首先通过 filter 筛选出目标客户且在指定时间范围内的订单,然后使用 mapToDouble 提取订单金额并通过 sum 方法计算总和,一步到位地实现了复杂的数据查询需求。

案例二:员工绩效考核统计

在企业管理系统里,有一个 Employee 类,包含员工 ID、绩效评分、部门等属性,存储在 List<Employee> 中。

class Employee {

private int employeeId;

private double performanceScore;

private String department;

// 构造函数、getter 和 setter 省略

}

要统计每个部门的平均绩效评分:

import java.util.ArrayList;

import java.util.List;

import java.util.Map;

import java.util.stream.Collectors;

public class PerformanceExample {

public static void main(String[] args) {

List<Employee> employees = new ArrayList<>();

// 假设这里填充了员工数据

Map<String, Double> departmentAverageScore = employees.stream()

.collect(Collectors.groupingBy(Employee::getDepartment, Collectors.averagingDouble(Employee::getPerformanceScore)));


departmentAverageScore.forEach((department, averageScore) -> System.out.println(department + " 平均绩效评分: " + averageScore));

}

}

这里利用 collect 方法结合 groupingBy 与 averagingDouble,先按照部门分组,再计算每组的平均绩效评分,最后以清晰的格式输出结果,高效完成了复杂的统计任务。

案例三:社交平台动态筛选

在社交平台应用中,有一个 Post 类,包含帖子 ID、发布用户 ID、发布时间、内容、点赞数等属性,存储在 List<Post> 中。假设要获取过去一周内点赞数超过 50 的热门帖子:

import java.time.LocalDateTime;

import java.util.ArrayList;

import java.util.List;

class Post {

private int postId;

private int userId;

private LocalDateTime postTime;

private String content;

private int likeCount;

// 构造函数、getter 和 setter 省略

}

public class SocialMediaExample {

public static void main(String[] args) {

List<Post> posts = new ArrayList<>();

// 假设这里填充了一些帖子数据

LocalDateTime oneWeekAgo = LocalDateTime.now().minusWeeks(1);

List<Post> popularPosts = posts.stream()

.filter(post -> post.getLikeCount() > 50 && post.getPostTime().isAfter(oneWeekAgo))

.toList();

popularPosts.forEach(post -> System.out.println("帖子 ID: " + post.getPostId() + ", 内容: " + post.getContent()));

}

}

通过 filter 依据点赞数和时间条件筛选出热门帖子,让用户能快速聚焦关注度高的内容,提升用户体验。

案例四:物流运输数据分析

在物流系统里,有一个 Shipment 类,包含运单号、发货地、收货地、重量、运输成本等属性,存储在 List<Shipment> 中。若要统计不同发货地到某一固定收货地的平均运输成本:

import java.util.ArrayList;

import java.util.List;

import java.util.Map;

import java.util.stream.Collectors;

class Shipment {

private String shipmentId;

private String origin;

private String destination;

private double weight;

private double cost;

// 构造函数、getter 和 setter 省略

}

public class LogisticsExample {

public static void main(String[] args) {

List<Shipment> shipments = new ArrayList<>();

// 假设这里填充了一些运单数据

String targetDestination = "北京";

Map<String, Double> averageCostByOrigin = shipments.stream()

.filter(shipment -> shipment.getDestination().equals(targetDestination))

.collect(Collectors.groupingBy(Shipment::getOrigin, Collectors.averagingDouble(Shipment::getCost)));


averageCostByOrigin.forEach((origin, cost) -> System.out.println(origin + " 到 " + targetDestination + " 的平均运输成本: " + cost));

}

}

利用 groupingBy 和 averagingDouble 配合 filter,精准统计出各地到特定收货地的成本情况,助力物流企业优化成本与规划路线。

总之,JDK 17 的 Stream API 为 Java 开发者赋予了强大的数据处理能力,通过这些复杂业务逻辑案例可见一斑。掌握它能让我们在面对各种刁钻的数据操作任务时,编写出更加简洁、高效且易于维护的代码,提升整个项目的开发效率与质量。


http://www.ppmy.cn/news/1567775.html

相关文章

react项目表格内容轮播,DataV-React轮播表的使用

项目中想要实现表格表头固定不动&#xff0c;表格行内容轮播呈现的效果&#xff0c;antd中的table无法实现&#xff0c;使用DataV-React轮播表来实现。 官网地址&#xff1a;介绍 | DataV-React 轮播表 | DataV-React 1. 安装 npm 安装 npm install jiaminghi/data-view-r…

两种交换排序算法--冒泡,快速

目录 1.冒泡排序原理 2.快速排序原理 3.冒泡代码实现 4.快速排序代码实现 1.冒泡排序原理 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;基本思想是通过反复交换相邻的元素&#xff0c;直到整个序列有序。它的名字来源于较大的元素像气泡…

spring spring-boot spring-cloud发布以及适配

https://spring.io/blog/2024/10/01/from-spring-framework-6-2-to-7-0 看了 spring 的官网&#xff0c;提到 2025 年 spring 会跟随 jdk 25 LTS发布后&#xff0c;接着发布 Spring Framework 7.0 GA&#xff0c;与之对应 spring 系列的组件版本情况如下。 Spring Framework版…

JavaScript系列(45)--响应式编程实现详解

JavaScript响应式编程实现详解 &#x1f504; 今天&#xff0c;让我们深入探讨JavaScript的响应式编程实现。响应式编程是一种基于数据流和变化传播的编程范式&#xff0c;它使我们能够以声明式的方式处理异步数据流。 响应式编程基础概念 &#x1f31f; &#x1f4a1; 小知识…

设计模式Python版 单例模式

文章目录 前言一、单例模式二、单例模式实现方式三、单例模式示例四、单例模式在Django框架的应用 前言 GOF设计模式分三大类&#xff1a; 创建型模式&#xff1a;关注对象的创建过程&#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模…

【山东乡镇界】面图层shp格式乡镇名称和编码wgs84坐标无偏移arcgis数据内容测评

标题中的“山东省乡镇界面图层shp格式乡镇名称和编码wgs84坐标无偏移arcgis数据”指的是一个地理信息系统&#xff08;GIS&#xff09;的数据集&#xff0c;专为山东省的乡镇区域设计。这个数据集包含了乡镇的边界信息&#xff0c;以Shapefile&#xff08;shp&#xff09;格式存…

【数据资产】数据资产管理概述

导读&#xff1a;数据资产管理在企业的数字化转型和业务发展中扮演着至关重要的角色。它直接关系到企业的决策效率、运营优化、业务创新以及风险防控等多个方面。数据资产作为企业的重要战略资源&#xff0c;能够为企业带来经济利益&#xff0c;其价值可能来自于数据本身的稀缺…

Unbutu虚拟机+eclipse+CDT编译调试环境搭建

问题1: 安装CDT&#xff0c;直接Help->eclipse Market space-> 搜cdt , install&#xff0c;等待重启即可. 问题2&#xff1a;C变量不识别vector ’could not be resolved 这是库的头文件没加好&#xff0c;右键Properties->C Build->Enviroment&#xff0c;增加…