当前位置: 首页 > 知识库问答 >
问题:

要映射的rxJava转换列表

卢文博
2023-03-14

我有一个从RESTendpoint返回的列表。我需要将该列表分为多个类别(类别是列表中每个条目中的一个项目)。各个类别将写入缓存,以便以后更快地查找。

我不知道我能不能。映射()条目,并提供多个filter()或某种类型的case语句,以将类别条目放入正确的bucket中。

用rxJava实现这样的东西听起来合理吗?

更新:非工作版本

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;
}

然而,这些按顺序触发,这是我的理解,第二个可观察对象没有发送任何saveCategoriesToCacheAction,因为它没有订阅第一个可观察对象的结果。

我开始认为应该修改缓存策略。列表将始终包含所有详细信息。该服务没有为我提供一个子集,我可以使用它列出清单,然后再调用它来获取完整的详细信息。它是一个项目的完整列表或完整详细信息。现在只单独缓存每一个,并将其缓存到各自的类别缓存中,这可能是一种更好的方法。我试图进行映射,以便此网络调用可以返回请求的类别,但后续调用将来自缓存,直到缓存过期并有新的网络调用刷新它为止。

共有3个答案

齐阳
2023-03-14

一般来说,可以使用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));
            });

它是如何工作的:

请记住,如果您对分组的可观察对象的内容不感兴趣,请订阅它们或对它们发出走(0)以防止内存泄漏。

我不确定这是否是最有效的方法,欢迎就这一解决方案提供一些意见。

乐正远航
2023-03-14

RxJava更多地用于异步消息处理,但由于它也支持函数式编程原则,因此它可以用作穷人的流api。如果您使用的是Java 8,请考虑使用streams来完成这项工作,但当您提出这个问题时,我假设您使用的是Java 7。

要做你想做的,你可以尝试(原谅lambda,如果你不使用Retrolambda,用匿名内部类代替它):

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

其中,groupItemInCategoryBucket是包含switch语句或其他缓存项的方法。

请注意,这相当于for循环,虽然在许多其他优秀的语言中使用这种风格是惯用的,但许多Java开发人员看到这段代码时可能会有点困惑。

潘刚洁
2023-03-14

我的解决方案是:

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)-创建一个可观察的发出前20个数字
  • groupBy(数字-
 类似资料:
  • 我有一个问题与转换列表对象映射字符串,列表对象。我正在寻找与一个关键名称的汽车所有组件的地图,一个值由汽车与此组件表示 我写了一个解决方案,但寻找一个更好的流解决方案。

  • 我是Mapstruct的新手。我试图将列表转换为地图,我在网上搜索了很多,我有一些解决方案,比如它还没有在mapstruct中实现。如果有人能提供一些替代解决方案,我将很高兴。所有我希望转换映射如下: 现在是否可以使用MapStruct来实现?

  • 我在将简单的JSON消息转换为映射时遇到问题 Example_1.json: Spring配置: 错误: org.springframework.integration.handler.LoggingHandler]-org.springframework.messaging.MessageHandling异常:未能将消息有效载荷写入文件;嵌套异常是java.lang.IllegalArgumen

  • 我想使用Java流按对用户列表进行分组。 例如,我有。

  • 我有一张这样的地图<代码>地图 我使用了对象映射器,但它不工作,因为映射在我的结构中包含另一个映射。