Java Stream详解

发布于:2025-06-22 ⋅ 阅读:(17) ⋅ 点赞:(0)

Java Stream详解

Stream 是 Java 8 引入的流式数据处理工具,可以像流水线一样对集合数据进行高效操作(过滤、转换、统计等)。核心特点:

  • 链式操作:支持多个操作串联
  • 不修改原始数据:生成新结果
  • 支持并行处理:自动利用多核性能

🛠️ 常用操作分两类
类型 特点 示例方法
中间操作 返回新 Stream,可继续操作 filter(), map(), sorted()
终端操作 最终输出结果,流结束 forEach(), collect(), count()

🔧 核心操作详解(附代码示例)

✅ 1. 过滤数据 filter()
List<String> list = Arrays.asList("a1", "a2", "b1", "c1", "c2");
list.stream()
    .filter(s -> s.startsWith("c")) // 过滤出以"c"开头
    .forEach(System.out::println);   // 输出:c1, c2
➡️ 2. 数据转换 map()
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<Integer> nameLengths = names.stream()
        .map(String::length)      // 字符串转成长度数值
        .collect(Collectors.toList()); // [5, 3, 7]
🔀 3. 扁平化转换 flatMap()
List<List<Integer>> numbers = Arrays.asList(
    Arrays.asList(1, 2),
    Arrays.asList(3, 4)
);

List<Integer> flattened = numbers.stream()
        .flatMap(Collection::stream) // 把多个列表"拍平"
        .collect(Collectors.toList()); // [1, 2, 3, 4]
📊 4. 去重 distinct()
List<Integer> nums = Arrays.asList(1, 2, 2, 3, 3, 3);
long count = nums.stream()
        .distinct()   // 去重
        .count();     // 统计数量 → 3
🔍 5. 条件匹配
List<Integer> nums = Arrays.asList(10, 20, 30);
boolean allEven = nums.stream()
        .allMatch(n -> n % 2 == 0); // 是否全是偶数? → true
boolean hasNegative = nums.stream()
        .anyMatch(n -> n < 0);       // 是否有负数? → false
🔄 6. 聚合计算 reduce()
List<Integer> nums = Arrays.asList(2, 4, 6);
int sum = nums.stream()
        .reduce(0, (a, b) -> a + b); // 累加求和 → 12
📦 7. 结果收集 collect()
List<String> words = Arrays.asList("apple", "banana", "cherry");
// 转成新集合
Set<String> set = words.stream()
        .filter(s -> s.length() > 5)
        .collect(Collectors.toSet()); // {"banana", "cherry"}

// 转成Map
Map<String, Integer> map = words.stream()
        .collect(Collectors.toMap(
            s -> s,          // key: 元素本身
            String::length    // value: 字符串长度
        )); // {"apple":5, "banana":6, "cherry":6}
🎯 8. 其他实用操作
// 获取数量
long count = stream.count();  

// 跳过前N个
List<Integer> result = IntStream.range(1,10)
        .skip(5)    // 跳过前5个
        .boxed().collect(Collectors.toList()); // [6,7,8,9]

// 限制数量
List<Integer> first3 = stream.limit(3).toList(); 

⚡ 并行流示例(提速技巧)

List<Integer> bigList = ... // 大数据集
long count = bigList.parallelStream() // 自动并行处理
        .filter(n -> n % 2 == 0)
        .count(); 

❗ 重要注意事项

  1. 流只能消费一次 - 终端操作后流即失效
  2. 中间操作延迟执行 - 直到终端操作才实际计算
  3. 非结构化数据不适用 - 如需要索引访问的场合

Stream 让数据处理代码更简洁高效,尤其适合大数据量或复杂操作场景 🚀。掌握这些核心操作后,可覆盖90%日常需求!


网站公告

今日签到

点亮在社区的每一天
去签到