Когда дело доходит до асинхронного программирования в Dart, ключевые слова asyncи awaitпредоставляют мощный способ работы с асинхронными операциями. Одним из наиболее часто используемых методов в пакете Dart asyncявляется map. В этой статье мы погрузимся в мир асинхронного отображения в Dart, изучая различные методы и приемы использования возможностей mapдля создания эффективного и лаконичного кода. Независимо от того, новичок вы или опытный разработчик, это руководство поможет вам повысить уровень своих навыков асинхронного программирования на Dart.
Методы асинхронного сопоставления:
- Базовый
map:
Базовое использованиеmapочень похоже на его синхронный аналог. Он принимает функцию обратного вызова, которая асинхронно преобразует каждый элемент коллекции и возвращает новую коллекцию с преобразованными значениями. Вот пример:
Future<List<int>> doubleNumbers(List<int> numbers) async {
return numbers.map((number) async {
await Future.delayed(Duration(seconds: 1)); // Simulating an asynchronous operation
return number * 2;
}).toList();
}
void main() async {
List<int> numbers = [1, 2, 3, 4, 5];
List<int> doubledNumbers = await doubleNumbers(numbers);
print(doubledNumbers); // Output: [2, 4, 6, 8, 10]
}
mapAsync:
МетодmapAsync, предоставляемый пакетомasync, позволяет асинхронно отображать коллекцию. и возвращает одно будущее. Это может быть полезно, если вы хотите выполнить некоторые дополнительные операции после завершения сопоставления. Вот пример:
import 'package:async/async.dart';
Future<List<int>> doubleNumbers(List<int> numbers) async {
final mappedNumbers = numbers.mapAsync((number) async {
await Future.delayed(Duration(seconds: 1)); // Simulating an asynchronous operation
return number * 2;
});
final transformedList = await mappedNumbers.toList();
// Perform additional operations on the transformed list
return transformedList;
}
void main() async {
List<int> numbers = [1, 2, 3, 4, 5];
List<int> doubledNumbers = await doubleNumbers(numbers);
print(doubledNumbers); // Output: [2, 4, 6, 8, 10]
}
asyncMap:
МетодasyncMapпохож наmap, но возвращает одно будущее, которое завершается список преобразованных значений. Это может быть полезно, если вы хотите дождаться завершения всех преобразований, прежде чем продолжить. Вот пример:
Future<List<int>> doubleNumbers(List<int> numbers) async {
return await Future.wait(numbers.asyncMap((number) async {
await Future.delayed(Duration(seconds: 1)); // Simulating an asynchronous operation
return number * 2;
}));
}
void main() async {
List<int> numbers = [1, 2, 3, 4, 5];
List<int> doubledNumbers = await doubleNumbers(numbers);
print(doubledNumbers); // Output: [2, 4, 6, 8, 10]
}
stream.map:
Если вы работаете с потоками в Dart, вы можете использовать методmap, предоставляемый19класс. Это позволяет асинхронно преобразовывать события потока. Вот пример:
import 'dart:async';
Stream<int> doubleNumbers(Stream<int> numbers) {
return numbers.map((number) async* {
await Future.delayed(Duration(seconds: 1)); // Simulating an asynchronous operation
yield number * 2;
});
}
void main() {
Stream<int> numbers = Stream.fromIterable([1, 2, 3, 4, 5]);
Stream<int> doubledNumbers = doubleNumbers(numbers);
doubledNumbers.listen((number) {
print(number); // Output: 2, 4, 6, 8, 10
});
}
В этой статье мы рассмотрели различные методы асинхронного сопоставления в Dart. Мы рассмотрели базовое использование map, методов mapAsyncи asyncMapдля более сложных сценариев, а также метода map. для потоковых преобразований. Овладев этими приемами, вы сможете писать более эффективный и выразительный асинхронный код в Dart.