gpt4 book ai didi

java - 按日期将事件列表分组到事件字典中

转载 作者:行者123 更新时间:2023-11-30 02:36:26 25 4
gpt4 key购买 nike

我一直在努力学习 RxJava2,但我一直在努力解决这个问题..

因此,我有一个表示事件的结构,如下所示:

class Event{
public Date when;
public String eventName;
}

在某个地方,我从存储库中查询了要按日期分组的事件列表。

因此,给定一个事件列表,例如:

  • 六月的 Activity 1
  • 六月 Activity 2
  • 7 月的 Activity 3
  • 8 月的 Activity 4
  • 8 月举行的 Activity 5

我想将它们分组,以便

  • 六月
    • 事件1
    • 事件2
  • 七月
    • 事件3
  • 八月
    • 事件4
    • 事件5

在我看来,到目前为止我所拥有的非常丑陋,而且我很确定我对此进行了过度“设计”......

repository.getAllEvents()
.toObservable()
.flatMap(new Function<Events, Observable<Event>>() {
@Override
public Observable<Event> apply(@NonNull Events events) throws Exception {
return Observable.fromIterable(events.getEvents());
}
})
.groupBy(new Function<Event, Date>() {
@Override
public Date apply(@NonNull Event event) throws Exception {
return event.when;
}
})
.flatMap(new Function<GroupedObservable<Date, Event>, Observable<Object>>() {
@Override
public Observable<Object> apply(@NonNull GroupedObservable<Date, Event> dateEventGroupedObservable) throws Exception {
final Date key = dateEventGroupedObservable.getKey();
return dateEventGroupedObservable.toList().toObservable().flatMap(new Function<List<Event>, ObservableSource<?>>() {
@Override
public ObservableSource<?> apply(@NonNull List<Event> events) throws Exception {
return Observable.just(new Pair<Date, List<Event>>(key, events));
}
});
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new Observer<Object>() {
@Override
public void onSubscribe(Disposable d) {

}

@Override
public void onNext(Object o) {

}

@Override
public void onError(Throwable e) {

}

@Override
public void onComplete() {

}
});

到目前为止,这给了我一个可观察的对象,它提供了一个 Pair> 但正如你所看到的,它被转换为对象,老实说我无法理解泛型 hell -.-'

关于如何解决这个问题有什么建议吗?

谢谢

最佳答案

您只需使用 collect 运算符即可实现此目的:

repository.getAllEvents()
.flatMapIterable(events -> events.getEvents())
.collect(() -> new HashMap<Date, List<Event>>(),
(map, event) -> putEventIntoMap(map, event)
)
...

没有 lambda 表达式:

// I assume that getAllEvents returns Events class
repository.getAllEvents()
.flatMapIterable(new Function<Events, Iterable<? extends Event>>() {
@Override
public Iterable<? extends Event> apply(@NonNull Events events) throws Exception {
return events.getEvents();
}
})
.collect(new Callable<HashMap<Date, List<Event>>>() {
@Override
public HashMap<Date, List<Event>> call() throws Exception {
return new HashMap<Date, List<Event>>();
}}, new BiConsumer<HashMap<Date, List<Event>>, Event>() {
@Override
public void accept(@NonNull HashMap<Date, List<Event>> map, @NonNull Event event) throws Exception {
putEventIntoMap(map, event);
}}
)
...

将事件放入 map 的方法:

private void putEventIntoMap(HashMap<Date, List<Event>> map, Event event) {
if (map.containsKey(event.when)) {
map.get(event.when).add(event);
} else {
List<Event> list = new ArrayList<>();
list.add(event);
map.put(event.when, list);
}
}

关于java - 按日期将事件列表分组到事件字典中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42917020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com