1 获取Stream流
//方式1
List<String> list = new ArrayList<>();
list.add("张无忌");
list.add("张良");
list.add("林绍玮");
Stream<String> stream1 = list.stream();
//方式2
Stream<String> stream2= Arrays.stream(new String[]{"张无忌", "张良", "张三丰", "张翠山", "谢广坤", "林绍玮"});
//方式3
Stream<String> stream3= Stream.of("张无忌", "张良", "张三丰", "张翠山", "谢广坤", "林绍玮");
2 中间方法
中间操作(Intermediate Operations)
中间操作返回新的流,支持链式调用,操作是惰性求值的(直到终端操作触发时才会执行)。
方法 | 说明 | 示例 |
---|---|---|
filter(Predicate<T>) |
过滤元素,保留满足条件的元素 | stream.filter(s -> s.length() > 3) |
map(Function<T, R>) |
将元素转换为另一种类型 | stream.map(String::toUpperCase) |
flatMap(Function<T, Stream<R>>) |
将每个元素转换为流,再合并为单一流 | stream.flatMap(list -> list.stream()) |
sorted() / sorted(Comparator<T>) |
自然排序或自定义排序 | stream.sorted((a, b) -> b.compareTo(a)) |
distinct() |
去重(依赖 equals 和 hashCode ) |
stream.distinct() |
peek(Consumer<T>) |
对每个元素执行操作,一般用于调试 | stream.peek(System.out::println) |
limit(long n) |
截取前 n 个元素 |
stream.limit(5) |
skip(long n) |
跳过前 n 个元素 |
stream.skip(2) |
3 终结方法
终端操作(Terminal Operations)
终端操作触发流的处理,并返回非流的结果(如集合、值、void
等)。
方法 | 说明 | 示例 |
---|---|---|
forEach(Consumer<T>) |
遍历每个元素(无返回值,可能破坏函数式风格) | stream.forEach(System.out::println) |
collect(Collector) |
将流转换为集合(如 List 、Set 、Map ) |
stream.collect(Collectors.toList()) |
toArray() |
将流转换为数组 | stream.toArray(String[]::new) |
reduce(...) |
将流聚合为单个值(如求和、求最大值) | stream.reduce(0, (a, b) -> a + b) |
min(Comparator<T>) / max(...) |
返回最小/最大元素(返回 Optional<T> ) |
stream.max(Integer::compare) |
count() |
返回元素个数 | stream.count() |
anyMatch(Predicate<T>) |
是否有任意元素满足条件(返回 boolean ) |
stream.anyMatch(s -> s.startsWith("A")) |
allMatch(...) / noneMatch(...) |
是否所有元素满足条件 / 没有元素满足条件 | stream.noneMatch(s -> s.isEmpty()) |
findFirst() / findAny() |
返回第一个元素 / 任意一个元素(返回 Optional<T> ) |
stream.findFirst() |
常见收集器(Collectors)
收集器 | 说明 |
---|---|
Collectors.toList() |
收集为 List |
Collectors.toSet() |
收集为 Set |
Collectors.toMap(...) |
收集为 Map (需指定键和值的映射函数) |
Collectors.joining(delimiter) |
将字符串流连接为单个字符串 |
Collectors.groupingBy(...) |
按条件分组为 Map<K, List<T>> |