Возьмите первый предмет и не завершайте - PullRequest
0 голосов
/ 30 сентября 2019

Есть ли способ (оператор) уменьшить / улучшить код ниже?

Я хочу взять первый элемент Наблюдаемой, но задержит его завершение до завершения источника (поэтому я согласен с ignoreElements).

public class SOTest {

    private final TestScheduler scheduler = new TestScheduler();

    @Test
    public void take_first_and_do_not_complete() {
        TestObserver<Long> test = Observable.interval(1, TimeUnit.SECONDS, scheduler)
                .take(7)
                .publish(o -> o
                        .firstElement()
                        .toObservable()
                        .concatWith(o
                                .doOnNext(e -> System.out.println("to be ignored: " + e))
                                .ignoreElements()
                        )
                )
                .doOnNext(e -> System.out.println("First is: " + e))
                .test();

        scheduler.advanceTimeTo(1, TimeUnit.SECONDS);

        test.assertValueCount(1);
        test.assertNotComplete();

        scheduler.advanceTimeTo(5, TimeUnit.SECONDS);
        test.assertValueCount(1);
        test.assertNotComplete();

        scheduler.advanceTimeTo(7, TimeUnit.SECONDS);
        test.assertValueCount(1);
        test.assertComplete();
    }
}

1 Ответ

1 голос
/ 02 октября 2019

Как насчет .distinctUntilChanged()

Observable.interval(1, TimeUnit.SECONDS, scheduler)
    .take(7)
    .distinctUntilChanged((a, b) -> true)
    .test();

Все элементы, кроме первого, заблокированы компаратором. Поток завершается, когда завершается восходящий поток.


Редактировать:

Еще короче с .distinct

Observable.interval(1, TimeUnit.SECONDS, scheduler)
    .take(7)
    .distinct(a -> 0)
    .test();
...