您现在的位置是:首页 > 编程 > 

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

2025-07-27 15:17:52
Java Stream流操作List全攻略:Filter、Sort、GroupBy、Average、Sum实践 在Java 8及更高版本中,Stream API为集合处理带来了革命性的改变。本文将深入解析如何运用Stream对List进行高效的操作,包括筛选(Filter)、排序(Sort)、分组(GroupBy)、求平均值(Average)和求和(Sum)。通过实例代码演示以及功能差异对比,我们

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

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

1. Filter操作

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

代码语言:java复制
List<Integer> numbers = Arrays.asList(1, 2, , 4, 5, 6, 7, 8, 9);
List<Integer> evenumbers = numbers.stream()
                                 .filter(n -> n % 2 == 0)
                                 .collect(());

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

2. Sort操作

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

代码语言:java复制
List<String> names = Arrays.asList("Bob", "Alice", "Charlie", "David");
List<String> sortedames = names.stream()
                               .sorted()
                               .collect(()); // 自然排序
List<String> reverseSortedames = names.stream()
                                      .sorted(Comparator.reverseOrder())
                                      .collect(()); // 倒序排序

. GroupBy操作

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

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

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

4. Average与Sum操作

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

代码语言:java复制
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(过滤)

代码语言:java复制
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, , 4, 5, 6, 7, 8, 9);

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

        println("Even umbers: " + evenumbers); // 输出:[2, 4, 6, 8]
    }
}

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

2. Sort(排序)

代码语言:java复制
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", 0),
                new Employee("Charlie", 28),
                new Employee("David", 2)
        );

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

        // 按名字降序排序
        List<Employee> sortedByameDesc = employees.stream()
                                                  .sorted(Comparatorparing(Employee::getame).reversed())
                                                  .collect(());

        println("Sorted by Age: " + sortedByAge);
        println("Sorted by ame Descending: " + sortedByameDesc);
    }
}

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

. GroupBy(分组)

代码语言:java复制
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", 0.0),
                new Product("Books", "ovel", 20.0)
        );

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

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

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

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

代码语言:java复制
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, 000.0, 4000.0, 5000.0);

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

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

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

6. 区别总结

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

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1220367.html

相关标签:无
上传时间: 2025-07-25 14:37:14
留言与评论(共有 16 条评论)
本站网友 性心理变态
2分钟前 发表
new Product("Books"
本站网友 旅游百事通官网
10分钟前 发表
" + evenumbers); // 输出:[2
本站网友 桑螵蛸
1分钟前 发表
// `.sum()` 和 `.average()` 分别用于计算数值流的总和和平均值
本站网友 协和医院广告
26分钟前 发表
5
本站网友 刘旭霞
8分钟前 发表
average()和sum()用于数值类型的统计分析
本站网友 抖一抖
30分钟前 发表
new Product("Electronics"
本站网友 心源性猝死最主要的原因
2分钟前 发表
适用于清洗数据
本站网友 茵陈的功效与作用
28分钟前 发表
1000.0)
本站网友 中央纪检委举报网站
29分钟前 发表
它将过滤后的流转换回一个新的List对象
本站网友 厘米和寸的换算
29分钟前 发表
doubleValue).sum(); println("Total Sales
本站网友 金恒
13分钟前 发表
000.0
本站网友 0452e
4分钟前 发表
在展示数据时需要排序
本站网友 期房贷款
0秒前 发表
本站网友 丰胸网
16分钟前 发表
List<Product>> groupedProducts = products.stream() .collect(Collectors.groupingBy(Product
本站网友 乙酰胆碱受体
24分钟前 发表
" + sortedByAge); println("Sorted by ame Descending