rxJava通过信号缓冲

时间:2018-03-26 19:51:55

标签: java rx-java2

我想使用rxJava按信号缓冲,如here所述,但是基于对象的时间戳而不是固定的间隔。如果将分钟用作信号,那么期望的结果将如下所示:

2018-03-26 19:14:13 2018-03-26 19:14:44 2018-03-26 19:14:59 ---- signal ---- 2018-03-26 19:15:23 2018-03-26 19:15:27 ---- signal ---- 2018-03-26 19:16:01 2018-03-26 19:16:04 2018-03-26 19:16:40 2018-03-26 19:16:45

我花了一整天的时间,但我无法让它发挥作用。这个问题已经被问到before但是接受的答案中的代码似乎是旧版本的rxJava。我还发现了另一个solution,但是这样也无法检查以前的值。

1 个答案:

答案 0 :(得分:0)

完整性的答案,但信誉完全归功于akarnokd。再次感谢!

OffsetDateTime baseDateTime = OffsetDateTime.of(2018, 3, 27, 0, 0, 0, 0, ZoneOffset.UTC);
    Observable
        .fromArray(
            baseDateTime.plusNanos(1),
            baseDateTime,
            baseDateTime,
            baseDateTime.plusMinutes(1),
            baseDateTime.plusMinutes(1).plusNanos(1),
            baseDateTime.plusMinutes(1),
            baseDateTime.plusMinutes(2).plusNanos(1),
            baseDateTime.plusMinutes(2),
            baseDateTime,
            baseDateTime.plusNanos(1),
            baseDateTime.plusMinutes(4),
            baseDateTime.plusMinutes(4).plusNanos(1)
        )
        .compose(bufferUntilChanged(dateTime -> dateTime.truncatedTo(ChronoUnit.MINUTES)))
        .subscribe(System.out::println);

private static <T, K> ObservableTransformer<T, List<T>> bufferUntilChanged(Function<T, K> keySelector) {
    return o -> o.publish(q -> q.buffer(q.distinctUntilChanged(keySelector).skip(1)));
}