RxJava flatMapIterable с одним

Я пытаюсь немного привести в порядок свой код, и Single выглядит как хороший выбор для меня, поскольку я делаю что-то, что когда-либо будет испускать только один результат.

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

getListOfItems()
.flatMapIterable(items -> items)
.flatMap(item -> doSomethingWithItem())
.toList()

это отлично работает, если getListOfItems возвращает Observable но если я попытаюсь вернуть его Single, то я не могу flatMapIterable и не вижу альтернативы, любые идеи?

4 ответов


flattenAsObservable должен сделать трюк, он будет отображать Single значение успеха Iterable (список) и выделите каждый элемент списка как Observable.

  getListOfItems()
            .flattenAsObservable(new Function<Object, Iterable<?>>() {
                @Override
                public Iterable<?> apply(@NonNull Object o) throws Exception {
                    return toItems(o);
                }
            })
            .flatMap(item -> doSomethingWithItem())
            .toList()

Я сделал что-то вроде этого

@Override
public Single<List<String>> getAvailablePaths() {
        return mongoClient.rxFind("t_polygons", new JsonObject())
                            .toObservable()
                            .flatMapIterable(list -> list)
                            .map(json -> json.getString("path"))
                            .filter(Objects::nonNull)
                            .toList()
                            .toSingle();
    }

основываясь на ответе от йосриза, это то, что я закончил в Котлин

getListOfItems()
        .flattenAsObservable { it }
        .flatMap { doSomethingWithItem(it) }
        .toList()

то же самое можно достичь с помощью Котлин в map, в зависимости от ваших предпочтений:

getListOfItems()
        .map { items ->
            items.map {
                doSomethingWithItem(it)
            }
        }

вы можете конвертировать Single to Observable С помощью оператора toObservable()

это будет выглядеть так:

getListOfItems()
    .toObservable()
    .flatMapIterable(items -> items)
    .flatMap(item -> doSomethingWithItem())
    .toList()