Dart 语言 Stream转换操作技巧

Dart阿木 发布于 2025-06-19 8 次阅读


Dart 语言 Stream 转换操作技巧详解

在 Dart 语言中,Stream 是一种异步数据序列,它允许我们以异步的方式处理数据流。Stream 提供了一系列的转换操作,这些操作可以帮助我们根据需求对数据进行处理和转换。本文将围绕 Dart 语言 Stream 转换操作技巧展开,详细介绍一些常用的转换方法,并通过实际代码示例进行说明。

Stream 转换操作是 Dart 语言中处理异步数据流的重要工具。通过使用这些操作,我们可以轻松地对 Stream 中的数据进行过滤、映射、合并等处理。掌握 Stream 转换操作对于编写高效、可读的 Dart 代码至关重要。

常用 Stream 转换操作

1. `map`

`map` 操作允许我们将 Stream 中的每个元素映射到另一个值。这是最常用的 Stream 转换操作之一。

dart

Stream<int> numbers = Stream.fromIterable([1, 2, 3, 4, 5]);

Stream<String> stringNumbers = numbers.map((number) => '$number');

stringNumbers.listen((number) {


print(number); // 输出: 1, 2, 3, 4, 5


});


2. `where`

`where` 操作允许我们根据条件过滤 Stream 中的元素。

dart

Stream<int> numbers = Stream.fromIterable([1, 2, 3, 4, 5]);

Stream<int> evenNumbers = numbers.where((number) => number.isEven);

evenNumbers.listen((number) {


print(number); // 输出: 2, 4


});


3. `expand`

`expand` 操作类似于 `map`,但它允许我们在每个元素上执行一个操作,并返回一个 Stream。

dart

Stream<int> numbers = Stream.fromIterable([1, 2, 3, 4, 5]);

Stream<int> expandedNumbers = numbers.expand((number) {


return Stream.fromIterable([number, number 2]);


});

expandedNumbers.listen((number) {


print(number); // 输出: 1, 2, 1, 2, 3, 6, 4, 8, 5, 10


});


4. `flatMap`

`flatMap` 操作类似于 `expand`,但它要求返回的 Stream 是单个元素,而不是一个 Stream 序列。

dart

Stream<List<int>> numbers = Stream.fromIterable([[1, 2], [3, 4], [5, 6]]);

Stream<int> flatMappedNumbers = numbers.flatMap((list) {


return Stream.fromIterable(list);


});

flatMappedNumbers.listen((number) {


print(number); // 输出: 1, 2, 3, 4, 5, 6


});


5. `merge`

`merge` 操作允许我们将多个 Stream 合并成一个 Stream。

dart

Stream<int> stream1 = Stream.fromIterable([1, 2, 3]);


Stream<int> stream2 = Stream.fromIterable([4, 5, 6]);

Stream<int> mergedStream = Stream.merge([stream1, stream2]);

mergedStream.listen((number) {


print(number); // 输出: 1, 2, 3, 4, 5, 6


});


6. `async`

`async` 是一个异步生成器,它允许我们在 Stream 中异步地生成数据。

dart

Stream<int> generateNumbers() async {


for (int i = 0; i < 5; i++) {


await Future.delayed(Duration(seconds: 1));


yield i;


}


}

Stream<int> numbers = generateNumbers();

numbers.listen((number) {


print(number); // 输出: 0, 1, 2, 3, 4


});


总结

Stream 转换操作是 Dart 语言中处理异步数据流的重要工具。通过使用 `map`、`where`、`expand`、`flatMap`、`merge` 和 `async` 等操作,我们可以轻松地对 Stream 中的数据进行处理和转换。掌握这些技巧对于编写高效、可读的 Dart 代码至关重要。

我们通过实际代码示例介绍了 Dart 语言中常用的 Stream 转换操作。希望这些示例能够帮助您更好地理解和使用 Stream 转换操作,从而提高您的 Dart 编程技能。