Java Stream流操作List全攻略:Filter、Sort、GroupBy、Average、Sum实践

news2025/1/15 6:12:34

在Java 8及更高版本中,Stream API为集合处理带来了革命性的改变。本文将深入解析如何运用Stream对List进行高效的操作,包括筛选(Filter)、排序(Sort)、分组(GroupBy)、求平均值(Average)和求和(Sum)。通过实例代码演示以及功能差异对比,我们将揭示这些操作在不同应用场景下的最佳实践。
在这里插入图片描述

1. Filter操作

filter()方法用于根据给定的条件过滤列表中的元素,仅保留满足条件的项。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
List<Integer> evenNumbers = numbers.stream()
                                 .filter(n -> n % 2 == 0)
                                 .collect(Collectors.toList());

上述代码展示了如何使用filter()方法从numbers列表中筛选出所有的偶数。

2. Sort操作

sorted()方法可以对流中的元素进行排序,可以使用自然顺序或自定义Comparator。

List<String> names = Arrays.asList("Bob", "Alice", "Charlie", "David");
List<String> sortedNames = names.stream()
                               .sorted()
                               .collect(Collectors.toList()); // 自然排序
List<String> reverseSortedNames = names.stream()
                                      .sorted(Comparator.reverseOrder())
                                      .collect(Collectors.toList()); // 倒序排序

3. GroupBy操作

groupBy()方法用于将流中的元素按照指定的属性进行分组,返回的是Map类型结果。

List<Employee> employees = ... // 假设Employee类有department属性
Map<String, List<Employee>> groupedEmployees = employees.stream()
                                                      .collect(Collectors.groupingBy(Employee::getDepartment));

这段代码展示了如何按员工所在的部门进行分组。

4. Average与Sum操作

对于数值型流,可以计算平均值(average)和总和(sum)。

List<Double> salaries = Arrays.asList(50000.0, 70000.0, 60000.0, 80000.0);
double averageSalary = salaries.stream()
                              .mapToDouble(Double::doubleValue)
                              .average()
                              .orElse(0.0);

double totalSalary = salaries.stream()
                            .mapToDouble(Double::doubleValue)
                            .sum();

5. 实战示例及代码详解

当然,让我们进一步深入到实战示例中,为上述的Filter、Sort、GroupBy、Average和Sum操作提供更详尽的代码详解。

1. 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);

        // 过滤出所有偶数
        List<Integer> evenNumbers = numbers.stream()
                                         .filter(n -> n % 2 == 0)
                                         .collect(Collectors.toList());

        System.out.println("Even Numbers: " + evenNumbers); // 输出:[2, 4, 6, 8]
    }
}

// 解释:
// `.stream()` 将列表转换成流。
// `.filter()` 方法接受一个谓词(Predicate),该谓词是一个返回布尔值的函数,用于决定哪些元素应该被保留。
// `.collect(Collectors.toList())` 是终端操作,它将过滤后的流转换回一个新的List对象。

2. Sort(排序)

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

public class StreamSortExample {
    public static class Employee {
        String name;
        int age;

        // 构造方法、getters & setters 省略

        @Override
        public String toString() {
            return "Employee{" +
                   "name='" + name + '\'' +
                   ", age=" + age +
                   '}';
        }
    }

    public static void main(String[] args) {
        List<Employee> employees = Arrays.asList(
                new Employee("Alice", 25),
                new Employee("Bob", 30),
                new Employee("Charlie", 28),
                new Employee("David", 32)
        );

        // 自然排序(默认按age升序)
        List<Employee> sortedByAge = employees.stream()
                                             .sorted(Comparator.comparing(Employee::getAge))
                                             .collect(Collectors.toList());

        // 按名字降序排序
        List<Employee> sortedByNameDesc = employees.stream()
                                                  .sorted(Comparator.comparing(Employee::getName).reversed())
                                                  .collect(Collectors.toList());

        System.out.println("Sorted by Age: " + sortedByAge);
        System.out.println("Sorted by Name Descending: " + sortedByNameDesc);
    }
}

// 解释:
// `Comparator.comparing(...)` 方法用来创建一个Comparator,根据指定的方法提取排序键。
// `.reversed()` 方法反转Comparator的顺序,使其成为降序排列。

3. GroupBy(分组)

import java.util.*;
import java.util.stream.Collectors;

public class StreamGroupByExample {
    public static class Product {
        String category;
        String name;
        double price;

        // 构造方法、getters & setters 省略

        @Override
        public String toString() {
            return "Product{" +
                   "category='" + category + '\'' +
                   ", name='" + name + '\'' +
                   ", price=" + price +
                   '}';
        }
    }

    public static void main(String[] args) {
        List<Product> products = Arrays.asList(
                new Product("Electronics", "Laptop", 1000.0),
                new Product("Electronics", "Smartphone", 500.0),
                new Product("Books", "Programming Book", 30.0),
                new Product("Books", "Novel", 20.0)
        );

        Map<String, List<Product>> groupedProducts = products.stream()
                                                            .collect(Collectors.groupingBy(Product::getCategory));

        for (Map.Entry<String, List<Product>> entry : groupedProducts.entrySet()) {
            System.out.println("Category: " + entry.getKey());
            System.out.println("Products: " + entry.getValue());
        }
    }
}

// 解释:
// `Collectors.groupingBy(...)` 提供了一个收集器,可以将流中的元素按照给定的函数进行分类并放入Map中。

4. Average(平均值)与Sum(求和)

import java.util.Arrays;
import java.util.List;
import java.util.stream.DoubleStream;
import java.util.stream.StreamSupport;

public class StreamAverageAndSumExample {
    public static void main(String[] args) {
        List<Double> sales = Arrays.asList(1000.0, 2000.0, 3000.0, 4000.0, 5000.0);

        // 计算销售额总和
        double totalSales = sales.stream().mapToDouble(Double::doubleValue).sum();
        System.out.println("Total Sales: " + totalSales);

        // 计算销售额平均值
        OptionalDouble averageSales = sales.stream().mapToDouble(Double::doubleValue).average();
        System.out.println("Average Sales: " + averageSales.orElse(0.0));
    }

    // 解释:
    // `.mapToDouble(...)` 将流中的元素映射为double值,便于进行数学运算。
    // `.sum()` 和 `.average()` 分别用于计算数值流的总和和平均值,`.average()` 返回的是OptionalDouble类型,需使用orElse(...)来处理可能为空的情况。

6. 区别总结

  • filter()用于筛选数据,是中间操作。适用于清洗数据、筛选符合条件的数据项。
  • sorted()用于排序数据,可作为中间操作也可作为终端操作。在展示数据时需要排序,如用户列表、商品列表等。
  • groupingBy()用于分组数据,是一个特殊的收集器,用于将流元素映射到Map中。数据汇总分析,如按地区统计销售额、按部门统计员工人数等。
  • average()sum()用于数值类型的统计分析,是终端操作。常用于数据分析、报表生成等场景,例如计算平均薪资、总销售额等。

What is Java technology and why do I need it?
Java is a programming language and computing platform first released by Sun Microsystems in 1995. It has evolved from humble beginnings to power a large share of today’s digital world, by providing the reliable platform upon which many services and applications are built. New, innovative products and digital services designed for the future continue to rely on Java, as well.

While most modern Java applications combine the Java runtime and application together, there are still many applications and even some websites that will not function unless you have a desktop Java installed. Java.com, this website, is intended for consumers who may still require Java for their desktop applications – specifically applications targeting Java 8. Developers as well as users that would like to learn Java programming should visit the dev.java website instead and business users should visit oracle.com/java for more information.

Is Java free to download?
Yes, Java is free to download for personal use.
Java is also free for development: developers can find all the development kits and other useful tools at https://www.oracle.com/javadownload/.

Why should I upgrade to the latest Java patch each quarter when prompted?
The latest Java patches contain important enhancements to improve performance, stability and security of the Java applications that run on your machine. Installing these updates will ensure that your Java applications continue to run with the most up-to-date version.

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

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

相关文章

《视听导报》是什么类型的报纸?报纸上发文章要交版面费吗?

作为个人成果发表的重要场所&#xff0c;报纸目前正得到越来越多单位的认可。不过在投稿时&#xff0c;我们既要考虑投稿的报纸是否符合评审标准&#xff0c;也要考虑发表文章的成本是否在我们的承受范围之内。 下面就让我们以《视听导报》为例&#xff0c;了解下如何查看报纸的…

candb++ windows11运行报错,找不到mfc140.dll

解决问题记录 mfc140.dll下载 注意&#xff1a;放置位置别搞错了

服务器引导异常,Grub报错: error: ../../grub-core/fs/fshelp.c:258:file xxxx.img not found.

服务器引导异常,Grub报错: error: ../../grub-core/fs/fshelp.c:258:file xxxx.img not found. 1. 故障现象2. 解决思路3. 故障分析4. 案件回溯5. 解决问题 1. 故障现象 有一台服务器业务报无法连接. 尝试用Ping命令发现无法ping通. 通过控制台查看发现有以下报错: error: ..…

LeetCode第432场周赛 (前3题|多语言)

比赛链接&#xff1a;第432场周赛 文章目录 3417. 跳过交替单元格的之字形遍历思路代码CJavaPython 3418. 机器人可以获得的最大金币数思路代码CJavaPython 3419. 图的最大边权的最小值思路代码CJavaPython 总结 3417. 跳过交替单元格的之字形遍历 思路 没啥好说的就是模拟 按…

下载导出Tomcat上的excle文档,浏览器上显示下载

目录 1.前端2.Tomcat服务器内配置3.在Tomcat映射的文件内放置文件4.重启Tomcat&#xff0c;下载测试 1.前端 function downloadFile() {let pictureSourceServer "http://192.168.1.1:8080/downFile/";let fileName "测试文档.xlsx";let fileURL pictu…

蓝桥杯备赛:顺序表和单链表相关算法题详解(上)

一.询问学号&#xff08;顺序表&#xff09; 1.题目来源&#xff1a; https://www.luogu.com.cn/problem/P3156 &#xff08;洛谷原题&#xff09; 2.解析与代码实现&#xff1a; &#xff08;1&#xff09;解析&#xff1a; 首先结合题目和输出样例不难看出这道题目是围绕两…

Java 基于微信小程序的高校科研团队管理系统设计与实现(附源码,部署,文档

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

C#,任意阶幻方(Magic Square)的算法与源代码

1 什么是幻方&#xff1f; 幻方&#xff08;Magic Square&#xff09;是一种将数字安排在正方形格子中&#xff0c;使每行、列和对角线上的数字和都相等的方法。 幻方也是一种中国传统游戏。旧时在官府、学堂多见。它是将从一到若干个数的自然数排成纵横各为若干个数的正方形&…

java求职学习day12

1 泛型机制&#xff08;熟悉&#xff09; 1.1 基本概念 &#xff08;1&#xff09;通常情况下集合中可以存放不同类型的元素&#xff0c;是因为将所有对象都看作Object类型放入&#xff0c;因此从集合中取出元素时&#xff0c;也是Object类型&#xff0c;为了表达该元素真实的…

uni-app h5修改浏览器导航栏的 title以及icon

1.title 在pages.json文件中修改:"navigationBarTitleText":"uni-app" 2.icon的修改 2.1 在static中新建一个index.html文件作为模板文件&#xff0c;并且将你的icon图片也放在static文件夹下 2.2 在index.html文件中加入如下代码&#xff08;记得icon文件…

Mac——Docker desktop安装与使用教程

摘要 本文是一篇关于Mac系统下Docker Desktop安装与使用教程的博文。首先介绍连接WiFi网络&#xff0c;然后详细阐述了如何在Mac上安装Docker&#xff0c;包括下载地址以及不同芯片版本的选择。接着讲解了如何下载基础镜像和指定版本镜像&#xff0c;旨在帮助用户在Mac上高效使…

OJ题目下篇

我们今天继续来看链表的算法题目 我们先来看第一道题&#xff1a; 这是一道牛客网的题目&#xff1a; 链表的回文结构_牛客题霸_牛客网 我们来看这道题&#xff1a;首先我们要判断是不是回文结构&#xff0c;我们之前判断过数组的回文&#xff0c;这是比较好判断的&#xff…

25/1/14 算法笔记<强化学习> CBR加强化学习

CBR,基于案例的推理&#xff0c;它是一种基于过去的实际经验或经历的推理&#xff0c;他可以根据过往的案例找到与当前案例最相关的案例&#xff0c;然后对该案例做改动来解决当前的问题。 CBR的过程 CBR可以看作一个循环过程&#xff1a;相似按键检索-->案例重用-->案…

初识JAVA-面向对象的三大特征之多态

1. 重温面向对象 面向对象是一种解决问题的思想&#xff0c;它把计算机程序看作是各种对象组合起来的。每个对象都有自己的数据&#xff08;属性&#xff09;和行为&#xff08;方法&#xff09;&#xff0c;主要依靠对象之间的交互来解决和实现问题。Java是一门纯面向对象的语…

Pytorch基础教程:从零实现手写数字分类

1.Pytorch简介 ‌PyTorch是一个开源的深度学习框架&#xff0c;由Facebook的人工智能研究院&#xff08;FAIR&#xff09;开发&#xff0c;并于2017年1月正式推出。‌ PyTorch以其灵活性和易用性著称&#xff0c;特别适合于深度学习模型的构建和训练。它基于Torch张量库开发&a…

高性能现代PHP全栈框架 Spiral

概述 Spiral Framework 诞生于现实世界的软件开发项目是一个现代 PHP 框架&#xff0c;旨在为更快、更清洁、更卓越的软件开发提供动力。 特性 高性能 由于其设计以及复杂精密的应用服务器&#xff0c;Spiral Framework框架在不影响代码质量以及与常用库的兼容性的情况下&a…

运维高级课作业三

源码编译安装httpd 2.4 首先下载好httpd-2.4.62.tar.bz2的安装包 将这个文件传入Linux中 将他解归档解入/usr/src/ rpm -e httpd --nodeps # 如果系统自带httpd这个软件要删除掉&#xff0c;两个软件不能同时运行 yum -y install apr apr-devel cyrus-sasl-devel expat-dev…

.Net8 Avalonia跨平台UI框架——<vlc:VideoView>控件播放海康监控、摄像机视频(Windows / Linux)

一、UI效果 二、新建用户控件&#xff1a;VideoViewControl.axaml 需引用&#xff1a;VideoLAN.LibVLC.Windows包 Linux平台需安装&#xff1a;VLC 和 LibVLC &#xff08;sudo apt-get update、sudo apt-get install vlc libvlccore-dev libvlc-dev&#xff09; .axaml 代码 注…

【HM-React】08. Layout模块

基本结构和样式reset 结构创建 实现步骤 打开 antd/Layout 布局组件文档&#xff0c;找到示例&#xff1a;顶部-侧边布局-通栏拷贝示例代码到我们的 Layout 页面中分析并调整页面布局 代码实现 pages/Layout/index.js import { Layout, Menu, Popconfirm } from antd impor…

Canvas简历编辑器-选中绘制与拖拽多选交互方案

Canvas简历编辑器-选中绘制与拖拽多选交互方案 在之前我们聊了聊如何基于Canvas与基本事件组合实现了轻量级DOM&#xff0c;并且在此基础上实现了如何进行管理事件以及多层级渲染的能力设计。那么此时我们就依然在轻量级DOM的基础上&#xff0c;关注于实现选中绘制与拖拽多选交…