Создайте наблюдаемые для каждого элемента в списке и объедините их результаты - PullRequest
0 голосов
/ 06 июня 2018

У меня есть две следующие функции Single:

fun getStrings(): Single<List<String>> {
    return Single.just(listOf("a", "a.b", "a.b.c"))
}

fun getStringParts(s: String): Single<List<String>> {
    return Single.just(s.split("."))
}

Я хочу объединить их так, чтобы получилось Map<String, List<String>, где key - результат первой функции иvalue является результатом второй функции для каждого String, поэтому

["a":["a"], "a.b":["a", "b"], "a.b.c":["a", "b", "c"]]

Я использую первую функцию, получаю List из String с, но не могу обернуть мою

  • как создать наблюдаемую для каждой строки в List
  • объединить их
  • объединить их результаты в Map

Ответы [ 2 ]

0 голосов
/ 06 июня 2018
val result = getStrings()
    .flattenAsObservable { it }         // Turn the list into a stream of items
    .flatMapSingle { key ->             // Take each item
        getStringParts(key)             // Get its parts
            .map { value ->
                key to value            // Combine key and value
            }
    }                                   // You now have a stream of pairs
    .toMap({ it.first }, { it.second }) // Build the map
    .blockingGet()

println(result)                         // {a=[a], a.b=[a, b], a.b.c=[a, b, c]}
0 голосов
/ 06 июня 2018
getStrings()
       .flattenAsFlowable { it }
       .flatMapSingle { s -> getStringParts(s).map { parts -> s to parts } }
       .toMap({ it.first }, { it.second })

Возвращает тип Single<MutableMap<String, List<String>>>.

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

...