Stream流

发布于:2025-03-09 ⋅ 阅读:(14) ⋅ 点赞:(0)

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) 将流转换为集合(如 ListSetMap 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>>