spring - 如何按 LocalDate 对通量元素进行分组?
问题描述
给定一个Flux<Event>
where Event 是:
data class Event(val eventDate: LocalDate, val data: String)
考虑到某些元素会在完全相同的 LocalDate 发生,我想按事件日期按升序对 Flux 元素进行分组。
目标是最终得到类似Flux<GroupedEvent>
where GroupedEvent
is 的东西:
data class GroupedEvent(val eventDate: LocalDate, val data: List<String>)
通知data: List<String>
将包含同时发生的所有数据LocalDate
。
如何才能做到这一点?
解决方案
对于给定的数据结构:
public class GroupedEvent {
private LocalDate localDate;
private List<String> data;
}
public class Event {
private LocalDate eventDate;
private String data;
}
你可以这样试试:
List<Event> data = Arrays.asList(
new Event(LocalDate.of(2019, 1, 1), "A"),
new Event(LocalDate.of(2019, 1, 2), "B"),
new Event(LocalDate.of(2019, 1, 3), "C"),
new Event(LocalDate.of(2019, 1, 1), "D"),
new Event(LocalDate.of(2019, 2, 1), "E")
);
Flux<Event> eventFlux = Flux.fromIterable(data);
Flux<GroupedFlux<LocalDate, Event>> groupedFluxFlux = eventFlux.groupBy(Event::getEventDate);
groupedFluxFlux.flatMap(groupedFlux ->
groupedFlux
.map(Event::getData)
.collectList()
.map(list -> new GroupedEvent(groupedFlux.key(), list))
)
.sort(Comparator.comparing(GroupedEvent::getLocalDate))
.doOnNext(groupedEvent -> System.out.println(groupedEvent.getLocalDate() + " -> " + groupedEvent.getData()))
.subscribe();
推荐阅读
- certbot - 如何查看 Certbot 制作的 SSL 证书中的所有域?
- php - PHP:调用时函数未运行,返回1
- javascript - Select2:通过vue js中的onclick事件加载后不起作用
- c# - 如何制作边界线
- javascript - 使用 jQuery 动态生成的文本框
- cron - Cron 作业将 Stdout/Stderr 重定向到日志文件和仅邮件 Stderr
- csv - QGIS:csv中的“添加分隔文本文件”忽略csvt文件中指定的精度
- rust - 如何在 Rust 中计算 21 阶乘?
- javascript - 检查列表中键最多的对象的最佳方法是什么?
- c++ - 互斥锁上的默认析构函数被阻止