Конвертировать поток ‹Список ‹T›› в поток ‹Карта‹ K, T ››

У меня есть требование преобразовать Stream<List<T>> в Stream<Map<K,T>>

У меня есть класс

class Order
{
    int id;
    DateTime date;
}

Я хочу преобразовать Stream<List<Order>> в Stream<Map<DateTime, List<Order>>

Я хочу отображать заказы, как показано ниже

12-дек-2020

         Order 1
         Order 2

13-дек-2020

         Order 3
         Order 4

14-дек-2020

         Order 5
         Order 6

Предложения по улучшению DS приветствуются.

Как мне это сделать?

Пожалуйста, предложите.

Заранее спасибо.


person Varun Shridhar    schedule 05.03.2021    source источник
comment
На свидание может быть несколько заказов. Поэтому Stream ‹Map‹ DateTime, List ‹Order› ›   -  person Varun Shridhar    schedule 05.03.2021
comment
У меня есть требование отображать заказы, сгруппированные по дате. Приветствуются предложения по улучшению DS   -  person Varun Shridhar    schedule 05.03.2021


Ответы (3)


Используя groupListsBy от _

K keySelector(T t) { ... }

final Stream<List<T>> source$ = ...;
final Stream<Map<K, List<T>>> result$ = source$.map((list) => list.groupListsBy(keySelector));
person Petrus Nguyễn Thái Học    schedule 18.03.2021

Вы можете сделать это без какого-либо пакета.

Сначала вы должны создать пустой Map, затем сопоставить List<Order> с картой с ключом в качестве даты из элемента списка (единый порядок), а затем добавить его на эту пустую карту.

Проверьте, доступна ли дата в качестве ключа на карте. Если дата существует как ключ на этой карте, просто добавьте новый порядок к этому значению или просто добавьте новый ключ на карту.

Код:

Stream<List<Order>> orders = ...;

Stream<Map<DateTime, List<Order>>> ordersByDate = {};

orders.forEach((Order order){
    ordersByDate.keys.contains(order.date)
      ? ordersByDate.update(order.date, (oldValue) => oldValue + <Order>[order])
      : ordersByDate[order.date] = [order];
});


print(ordersByDate);

//At here your ordersByDate

Дайте мне знать, если это сработает для вас.

person kishan dhankecha    schedule 18.03.2021

Метод складывания - это то, что вы ищете для. Пример:

void main() async {
  final today = DateTime.now();
  final tomorrow = today.add(const Duration(days: 1));
  final order1 = Order(1, today);
  final order2 = Order(2, today);
  final order3 = Order(3, tomorrow);
  
  final x = await Stream
    .fromIterable([order1, order2, order3])
    .fold<Map<DateTime, List<Order>>>({}, (val, element)  {
      (val[element.date] ??= []).add(element);
      
      // Same as:
      // if (val[element.date] == null) {
      //   val[element.date] = [];
      // }
      // val[element.date]!.add(element);
    
      return val;
    });
  
  print(x);
}


class Order
{
    int id;
    DateTime date;
  
    Order(this.id, this.date);
  
    @override
    String toString() {
      return 'Order(id: $id, date: $date)';
    }
}
person Giovanni Londero    schedule 15.04.2021