#rx-java #rx-java2
Вопрос:
У меня есть список объектов-источников, и мне нужно преобразовать его в список объектов-результатов, используя группу по имени
class SourceObject {
private String name;
private String grade;
}
class ResultObject {
private String name;
private List<String> grades;
}
В принципе, мне нужно сгруппировать по имени и добавить все оценки учащихся в ResultObject, поэтому, если есть x количество объектов SourceObject, то количество объектов ResultObject должно быть
Для SourceObject
того, чтобы иметь одно и то же имя, они преобразуются в одно ResultObject
Ввод: Single<SourceObject>
Выход: Single<ResultObject>
Ответ №1:
Превратите внутренний список в последовательность, соберите результат с помощью хэш-карты, а затем сопоставьте значения обратно в список:
Single<List<SourceObject>> source = ...
Single<List<ResultObject>> result = source
.flattenAsObservable(v -> v)
.collect(
() -> new HashMap<String, ResultObject>(),
(map, item) -> map.computeIfAbsent(item.name,
k -> new ResultObject(k)).grades.add(item.grade))
)
.<List<ResultObject>>map(map -> new ArrayList<ResultObject>(map.values()))
;