Android RxJava - GroupBy和Merge回来了?

时间:2017-02-07 10:45:36

标签: java android rx-java rx-java2

如何按以下标准按日期订购对象列表:

1)日期> =今天

的所有对象

2)日期<今天

示例:

今天= 7月/ 2月

  

列表= [{5 / Feb,8 / Feb,6 / Feb,4 / Feb,9 / Feb}]

     

预期结果= [{8 / Feb,9 / Feb,6 / Feb,5 / Feb,4 / Feb]}

我现在吃了什么:

dummyProvider
            .getAllObjects()
            .map(mapper::mapToDateObject) //Convert to new object -> DateObject
            .groupBy(dateObject -> dateObject.getDateTime().isAfterNow())
            //What now? 

此时我按照日期(现在'现在'之后'现在')对它们进行分组,现在我需要将其合并并返回{{1} }。

1 个答案:

答案 0 :(得分:2)

在我看来,groupBy的解决方案会因你的情况而过于复杂。你可以在没有groupBy的情况下完成:

dummyProvider
    .getAllObjects()
    .map(mapper::mapToDateObject)
    .toList()
    .flatMapObservable(list -> 
        //emit dateObjects afterNow first
        Observable.fromIterable(list)
            .filter(dateObject -> dateObject.getDateTime().isAfterNow())
            //you did't mention this in your criteria, but according
            //to expected result I assume that you need sorted items on each side
            .sorted(...)
            //then emit dateObjects != afterNow
            .concatWith(
                Observable.fromIterable(list)
                    .filter(dateObject -> !dateObject.getDateTime().isAfterNow())
                    .sorted(...)))
    .toList()
    .subscribe(...)

但使用groupBy Kotlin 解决方案更优雅:

dummyProvider
    .getAllObjects()
    .map(mapper::mapToDateObject)
    .groupBy { it.getDateTime().isAfterNow() }
    .toList()
    .flatMapObservable { list ->
        list.first { it.key }.sorted { ... }
             .concatWith(list.first { !it.key }.sorted { ... }) }
    .toList()