Java List流式编程全解析:从入门到实战高手

4 阅读3分钟

🚀 Java List流式编程全解析:从入门到实战高手

#Java8新特性 #Stream流 #集合操作 #高效编程


一、为什么需要Stream流?

传统集合操作痛点

  • 代码冗长:多层循环嵌套,可读性差
  • 难以并行:手动拆分任务实现复杂
  • 效率低下:频繁中间变量创建

Stream核心优势: ✅ 链式调用:一行代码完成复杂操作 ✅ 延迟执行:优化计算路径提升性能 ✅ 并行支持:自动利用多核CPU


二、Stream核心操作一览

操作类型常用方法特点
创建流stream(), parallelStream()开启流式处理
中间操作filter(), map(), sorted()可链式调用,延迟执行
终端操作collect(), forEach(), count()触发实际计算,流不可复用

三、六大必学场景+代码实战

1. 过滤数据:快速筛选元素

List<User> users = Arrays.asList(  
    new User("Alice", 25),  
    new User("Bob", 17),  
    new User("Charlie", 30)  
);  

// 筛选年龄≥18的用户  
List<User> adults = users.stream()  
                        .filter(u -> u.getAge() >= 18)  
                        .collect(Collectors.toList());  
// 输出:[Alice(25), Charlie(30)]  

2. 数据转换:提取/处理字段

// 提取用户名并转为大写  
List<String> names = users.stream()  
                         .map(User::getName)  
                         .map(String::toUpperCase)  
                         .collect(Collectors.toList());  
// 输出:[ALICE, BOB, CHARLIE]  

3. 排序操作:多条件灵活排序

// 按年龄降序,同名按姓名升序  
List<User> sorted = users.stream()  
                        .sorted(Comparator  
                            .comparingInt(User::getAge).reversed()  //根据 User 对象的 age 属性进行排序,将默认的升序排序反转为降序排序。
                            .thenComparing(User::getName))  //如果两个用户的 age 相同,则进一步根据 name 属性进行升序排序。
                        .collect(Collectors.toList());  

4. 去重技巧:对象与基本类型

List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 3, 3);  

// 基本类型去重  
List<Integer> distinct = numbers.stream().distinct().toList();  

// 对象根据字段去重(需重写equals/hashCode)  
List<User> uniqueUsers = users.stream()  
                             .distinct()  
                             .toList();  

5. 聚合统计:快速计算汇总值

// 求年龄总和  
int totalAge = users.stream()  
                  .mapToInt(User::getAge)  
                  .sum();  

// 复杂统计(最大、最小、平均)  
IntSummaryStatistics stats = users.stream()  
                                 .mapToInt(User::getAge)  
                                 .summaryStatistics();  
System.out.println("平均年龄:" + stats.getAverage());  

6. 分组与分区:数据多维分析

// 按年龄段分组  
Map<String, List<User>> ageGroups = users.stream()  
    .collect(Collectors.groupingBy(u -> {  
        if (u.getAge() < 18) return "未成年";  
        else if (u.getAge() <= 35) return "青年";  
        else return "中年";  
    }));  

// 按是否成年分区  
Map<Boolean, List<User>> partition = users.stream()  
    .collect(Collectors.partitioningBy(u -> u.getAge() >= 18));  

四、并行流:轻松实现多线程处理

// 普通流 vs 并行流耗时对比  
List<Integer> numbers = IntStream.range(0, 1_000_000).boxed().toList();  

long start = System.currentTimeMillis();  
numbers.stream().reduce(Integer::sum).ifPresent(System.out::println);  
System.out.println("顺序流耗时:" + (System.currentTimeMillis() - start) + "ms");  

start = System.currentTimeMillis();  
numbers.parallelStream().reduce(Integer::sum).ifPresent(System.out::println);  
System.out.println("并行流耗时:" + (System.currentTimeMillis() - start) + "ms");  

输出示例

顺序流耗时:58ms  
并行流耗时:12ms  

注意事项

  • 数据量小(<1万)时,并行可能更慢
  • 确保操作线程安全(无共享可变状态)

五、避坑指南:常见错误与最佳实践

5.1 典型错误

// 错误1:重复使用流  
Stream<User> stream = users.stream();  
stream.filter(u -> u.getAge() > 20);  
stream.map(User::getName); // 抛出IllegalStateException  

// 错误2:修改源数据  
users.stream()  
    .peek(u -> u.setAge(u.getAge() + 1)) // 危险操作!  
    .collect(Collectors.toList());  

5.2 性能优化技巧

  1. 优先使用基本类型流mapToInt()替代map()减少装箱开销
  2. 短路操作提前终止anyMatch()/findFirst()减少计算量
  3. 避免复杂中间操作:合并filtermap减少循环次数

六、实战案例:电商订单处理

需求:统计2023年每个用户的订单总金额,筛选出消费≥1000元的VIP用户

List<Order> orders = getOrders(); // 获取所有订单  

Map<User, Double> userSpending = orders.stream()  
    .filter(o -> o.getDate().getYear() == 2023)  
    .collect(Collectors.groupingBy(  
        Order::getUser,  
        Collectors.summingDouble(Order::getAmount)  
    ));  

List<User> vipUsers = userSpending.entrySet().stream()  
    .filter(entry -> entry.getValue() >= 1000)  
    .map(Map.Entry::getKey)  
    .sorted(Comparator.comparing(User::getName))  
    .toList();  

七、总结与进阶

核心价值

  • 代码简洁度提升50%+
  • 大数据处理性能显著优化

学习资源

掌握Stream流,让你的Java代码更简洁高效! 🚀