Convert rxJava List to Map

I have a list coming back from a REST endpoint. I need to break this list down into categories (a category is an element in every entry in the list). Certain categories will be cached for faster retrieval later.

I did not know if I could make .map () entries and provide some filters () or some type of case-case to place category entries in the right bucket.

Is it wise to implement something like this sound using rxJava?

UPDATE: Non-working version

private Map<String, List<VideoMetadataInfoEntity>> buildCategories( Observable<List<VideoMetadataInfoEntity>> videoList ) {

    Map<String, List<VideoMetadataInfoEntity>> categoryMap = new HashMap<>();
    videoList
            .flatMap( Observable::from )
            .subscribe( videoMetadataInfoEntity -> mapCategory(videoMetadataInfoEntity, categoryMap ) );

    Observable.just( categoryMap )
            .doOnNext( saveCategoriesToCacheAction );

    return categoryMap;
}

However, this fire is in order, and this is my understanding, the second observable does not send anything saveCategoriesToCacheAction, since it is not subscribed to the result of the first observable.

, . . , , , . , . , . , , , , .

+4
3

:

Observable.range(1, 20)
            .groupBy(number -> number % 2)
            .flatMap(groupedObservable -> groupedObservable.toList())
            .toMap(list -> list.get(0) % 2);

[{0=[2, 4, 6, 8, 10, 12, 14, 16, 18, 20], 1=[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]}]

:

  • (1, 20) - ,
  • groupBy ( → % 2) - , , , ( x% 2)
  • flatMap (groupedObservable → groupedObservable.toList()) - ,
  • toMap (list → list.get(0)% 2) -
+3

groupBy ( ).

Map<Integer, List<Integer>> groupedValues = new HashMap<>(4);
    Observable.range(1, 20)
            .groupBy(i -> i % 2, i -> i)
            .subscribe(go -> {
                List<Integer> groupValues = new ArrayList<>();
                groupedValues.put(go.getKey(), groupValues);
                go.subscribe(t -> add(t, groupValues));
            });

:

-, 1 20 ( range) (groupBy, GroupedObservable) , ( onNext) , , .

take(0) , .

, , .

+1

RxJava , , api. Java 8, , , , , Java 7.

, , ( , , Retrolambda):

Observable.from(list).subscribe(item -> groupItemInCategoryBucket(item));

groupItemInCategoryBucket - , switch .

, for, , Java , .

0
source

Source: https://habr.com/ru/post/1616664/


All Articles