RxJava: Как объединить список объектов со списком других объектов, сгруппированных по

#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()))
   ;