如何解决将 Stream<List<T>> 转换为 Stream<Map<K,T>>
我需要将 Stream<List<T>>
转换为 Stream<Map<K,T>>
我有课
class Order
{
int id;
DateTime date;
}
我想将 Stream<List<Order>>
转换为 Stream<Map<DateTime,List<Order>>
我想如下显示订单
2020 年 12 月 12 日
Order 1
Order 2
2020 年 12 月 13 日
Order 3
Order 4
2020 年 12 月 14 日
Order 5
Order 6
欢迎提出更好的 DS 建议。
我该怎么做?
请提出建议。
提前致谢。
解决方法
使用 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));
,
你可以在没有任何包的情况下做到这一点。
首先,您必须创建一个空的 Map
,然后将 List<Order>
映射到一个以列表项中的日期作为键的映射(单顺序),然后将其添加到那个空映射中。
检查日期是否可用作 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
告诉我它是否适合您。
,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)';
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。