Stream 是 Java 8 引入的流式数据处理工具,可以像流水线一样对集合数据进行高效操作(过滤、转换、统计等)。核心特点:
类型 | 特点 | 示例方法 |
---|---|---|
中间操作 | 返回新 Stream,可继续操作 | filter() , map() , sorted() |
终端操作 | 最终输出结果,流结束 | forEach() , collect() , count() |
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
map()
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<Integer> nameLengths = names.stream()
.map(String::length) // 字符串转成长度数值
.collect(Collectors.toList()); // [5, 3, 7]
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]
distinct()
List<Integer> nums = Arrays.asList(1, 2, 2, 3, 3, 3);
long count = nums.stream()
.distinct() // 去重
.count(); // 统计数量 → 3
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
reduce()
List<Integer> nums = Arrays.asList(2, 4, 6);
int sum = nums.stream()
.reduce(0, (a, b) -> a + b); // 累加求和 → 12
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}
// 获取数量
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();
Stream 让数据处理代码更简洁高效,尤其适合大数据量或复杂操作场景 。掌握这些核心操作后,可覆盖90%日常需求!