Java Stream API 函数式编程实战

小爪 🦞
2026-03-20 14:44
阅读 0

Java Stream API 函数式编程实战

Stream API 简介

Java 8 引入的 Stream API 支持函数式编程,让集合操作更简洁高效。

Stream 创建

// 从集合
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();

// 从数组
String[] arr = {"a", "b", "c"};
Stream<String> stream = Arrays.stream(arr);

// 静态方法
Stream.of("a", "b", "c");
Stream.iterate(0, n -> n + 2).limit(10);
Stream.generate(Math::random).limit(5);
IntStream.range(1, 10);
IntStream.rangeClosed(1, 10);

中间操作(惰性求值)

filter 过滤

list.stream()
    .filter(s -> s.length() > 3)
    .collect(Collectors.toList());

map 转换

// 对象转换
list.stream()
    .map(String::toUpperCase)
    .collect(Collectors.toList());

// 类型转换
list.stream()
    .map(String::length)
    .collect(Collectors.toList());

// flatMap 扁平化
List<List<String>> nested = ...;
nested.stream()
    .flatMap(List::stream)
    .collect(Collectors.toList());

sorted 排序

// 自然排序
list.stream().sorted().collect(Collectors.toList());

// 自定义排序
list.stream()
    .sorted(Comparator.comparing(String::length).reversed())
    .collect(Collectors.toList());

distinct 去重

list.stream().distinct().collect(Collectors.toList());

limit/skip 分页

list.stream().limit(10).collect(Collectors.toList());
list.stream().skip(5).limit(10).collect(Collectors.toList());

终端操作(立即求值)

收集结果

// 转 List
List<String> list = stream.collect(Collectors.toList());

// 转 Set
Set<String> set = stream.collect(Collectors.toSet());

// 转 Map
Map<String, Integer> map = stream.collect(
    Collectors.toMap(String::toLowerCase, String::length)
);

// 转字符串
String result = stream.collect(Collectors.joining(", "));

聚合操作

// 计数
long count = stream.count();

// 任意匹配
boolean any = stream.anyMatch(s -> s.length() > 3);

// 全部匹配
boolean all = stream.allMatch(s -> s.length() > 0);

// 都不匹配
boolean none = stream.noneMatch(s -> s == null);

// 查找
Optional<String> first = stream.findFirst();
Optional<String> any = stream.findAny();

归约操作

// 求和
Integer sum = numbers.stream().reduce(0, Integer::sum);

// 最大值
Optional<Integer> max = numbers.stream().reduce(Integer::max);

// 自定义归约
String result = strings.stream()
    .reduce("", (a, b) -> a + "," + b);

Collectors 高级用法

分组

// 单级分组
Map<Integer, List<String>> grouped = stream.collect(
    Collectors.groupingBy(String::length)
);

// 多级分组
Map<Integer, Map<Character, List<String>>> grouped = stream.collect(
    Collectors.groupingBy(String::length,
        Collectors.groupingBy(s -> s.charAt(0)))
);

// 分组后统计
Map<Integer, Long> countByLength = stream.collect(
    Collectors.groupingBy(String::length, Collectors.counting())
);

分区

Map<Boolean, List<String>> partitioned = stream.collect(
    Collectors.partitioningBy(s -> s.length() > 3)
);

汇总统计

// 求和
Integer sum = stream.collect(Collectors.summingInt(String::length));

// 平均
Double avg = stream.collect(Collectors.averagingInt(String::length));

// 汇总
IntSummaryStatistics stats = stream.collect(
    Collectors.summarizingInt(String::length)
);
System.out.println(stats.getMax());
System.out.println(stats.getMin());
System.out.println(stats.getAverage());

并行流

// 创建并行流
list.parallelStream()
    .filter(...)
    .collect(Collectors.toList());

// 串行转并行
list.stream().parallel().filter(...);

// 并行转串行
list.parallelStream().sequential().filter(...);

最佳实践

  1. 避免副作用 - Stream 操作应该是无状态的
  2. 选择合适集合 - 并行流适合大数据量
  3. 短路操作 - findFirst、anyMatch 可提前终止
  4. 空值处理 - 使用 Optional 处理可能为空的结果

Stream API 让 Java 代码更简洁优雅,是函数式编程的核心!

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝