Java 中哪些数据结构支持流式操作,以及如何使用


1️⃣ 支持流式操作的数据结构

在 Java 8 及以上,实现了 java.util.Collection 接口的集合类 都可以生成流:

数据结构支持方式
List(ArrayList, LinkedList)list.stream() / list.parallelStream()
Set(HashSet, TreeSet, LinkedHashSet)set.stream() / set.parallelStream()
Queue(PriorityQueue, LinkedList)queue.stream()
Deque(ArrayDeque, LinkedList)deque.stream()

注意:Map 不直接是 Collection,但可以通过 keySet、values 或 entrySet 生成流。


Map 流式操作方式

Map<String, Integer> map = Map.of("a",1,"b",2,"c",3);

// 遍历 key
map.keySet().stream().forEach(System.out::println);

// 遍历 value
map.values().stream().forEach(System.out::println);

// 遍历 entry
map.entrySet().stream().forEach(e -> System.out.println(e.getKey() + ":" + e.getValue()));

2️⃣ Stream 的生成方式

(1)从集合生成

List<String> list = List.of("apple", "banana", "cherry");
Stream<String> stream = list.stream(); // 顺序流
Stream<String> parallelStream = list.parallelStream(); // 并行流

(2)从数组生成

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

(3)从 Map 生成

Map<String,Integer> map = Map.of("x",1,"y",2);
Stream<Map.Entry<String,Integer>> entryStream = map.entrySet().stream();

(4)通过 Stream.of()

Stream<String> stream = Stream.of("one","two","three");

(5)无限流(适合流式处理大数据)

Stream<Integer> infinite = Stream.iterate(0, n -> n + 1); // 0,1,2,...
Stream<Double> randomStream = Stream.generate(Math::random); // 随机数流

无限流通常要加上 limit(n) 才能有限处理。


3️⃣ 流式操作分类

中间操作(Lazy,返回新 Stream)

操作说明
map映射每个元素到新值
filter过滤元素
distinct去重
sorted排序
limit限制元素数量
skip跳过前 n 个元素
flatMap展平嵌套结构

终端操作(Trigger 执行,返回结果或副作用)

操作说明
collect收集成集合或其他容器
toList() / toSet()收集为 List 或 Set
forEach遍历处理
reduce聚合(求和、拼接等)
count统计元素数量
anyMatch / allMatch条件匹配

4️⃣ 流式操作示例

(1)过滤 + 映射 + 收集

List<String> fruits = List.of("apple","banana","cherry","avocado");

List<String> result = fruits.stream()
        .filter(f -> f.startsWith("a"))   // 过滤
        .map(String::toUpperCase)         // 转大写
        .toList();                        // 收集

输出:

["APPLE", "AVOCADO"]

(2)处理 Map

Map<String,Integer> scores = Map.of("Tom",90,"Jerry",80,"Anna",95);

List<String> topStudents = scores.entrySet().stream()
        .filter(e -> e.getValue() > 85)
        .map(Map.Entry::getKey)
        .toList();

输出:

["Tom", "Anna"]

(3)无限流示例

Stream<Integer> numbers = Stream.iterate(0, n -> n + 1);

List<Integer> first10Even = numbers
        .filter(n -> n % 2 == 0)
        .limit(10)
        .toList();

输出:

[0,2,4,6,8,10,12,14,16,18]

5️⃣ 总结

  1. 集合类(List、Set、Queue)都可以流式操作

  2. Map 需要通过 keySet/values/entrySet 生成流

  3. Stream 分中间操作和终端操作

    • 中间操作可链式组合,不消耗结果(Lazy)。
    • 终端操作触发执行,返回结果或副作用。
  4. 无限流和边读边处理可用于大数据场景(类似你大文件的流式解析)。


💡 建议:

  • 如果要处理大文件或大集合,尽量 使用流式处理 + limit / filter / map,避免一次性占用大量内存。

更多推荐