【问题标题】:Convert Stream<List<T>> to Stream<Map<K,T>>将 Stream<List<T>> 转换为 Stream<Map<K,T>>
【发布时间】:2021-03-05 11:02:28
【问题描述】:

我需要将Stream&lt;List&lt;T&gt;&gt; 转换为Stream&lt;Map&lt;K,T&gt;&gt;

我有课

class Order
{
    int id;
    DateTime date;
}

我想将Stream&lt;List&lt;Order&gt;&gt; 转换为Stream&lt;Map&lt;DateTime, List&lt;Order&gt;&gt;

我想如下显示订单

2020 年 12 月 12 日

         Order 1
         Order 2

2020 年 12 月 13 日

         Order 3
         Order 4

2020 年 12 月 14 日

         Order 5
         Order 6

欢迎提出更好的 DS 的建议。

我该怎么做?

请提出建议。

提前致谢。

【问题讨论】:

  • 一个日期可能有多个订单。因此 Stream>
  • 我需要显示按日期分组的订单。欢迎提出更好的 DS 建议

标签: dart rxdart


【解决方案1】:

使用来自collection: ^1.15.0的groupListsBy

K keySelector(T t) { ... }

final Stream<List<T>> source$ = ...;
final Stream<Map<K, List<T>>> result$ = source$.map((list) => list.groupListsBy(keySelector));

【讨论】:

  • 所需导入:import 'package:collection/collection.dart';
  • 有点不对劲!我想按列表的第一个数字对列表进行分组。所以int keySelector(List&lt;int&gt; l) { return l[0]; }。 source$.map((list) =&gt; list.groupListsBy(keySelector)); 告诉我The argument type 'int Function(List&lt;int&gt;)' can't be assigned to the parameter type 'dynamic Function(int)'.。我做错了什么?
【解决方案2】:

你可以在没有任何包的情况下做到这一点。

首先,您必须创建一个空的Map,然后将List&lt;Order&gt; 映射到一个映射,其中键作为列表项中的日期(单次顺序),然​​后将其添加到那个空映射。

检查日期是否可用作 Map 中的键。如果日期作为该映射中的键存在,则只需向该值添加一个新顺序,或者只需向该映射添加一个新键。

代码:

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

让我知道它是否适合你。

【讨论】:

    【解决方案3】:

    Fold method 是您正在寻找的。 示例:

    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)';
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-11-08
      • 1970-01-01
      • 2016-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-15
      • 2017-10-08
      相关资源
      最近更新 更多