【问题标题】:How To Generate Mono<Map<Map<List>> from Flux如何从 Flux 生成 Mono<Map<Map<List>>
【发布时间】:2018-10-15 15:00:45
【问题描述】:

我在Flux.&lt;Response&gt;fromIterable(responses) 的回复下方有一个回复表单。我想将其转换为地图的单声道,如下所示:

Mono>>> collectMap = ?

其中 company 是第一个键,将生成另一个响应图,其中 category 为键。

List< Response> responses = new ArrayList(){
            {
                add(Response.builder().company("Samsung").category("Tab").price("$2000").itemName("Note").build());
                add(Response.builder().company("Samsung").category("Phone").price("$2000").itemName("S9").build());
                add(Response.builder().company("Samsung").category("Phone").price("$1000").itemName("S8").build());
                add(Response.builder().company("Iphone").category("Phone").price("$5000").itemName("Iphone8").build());
                add(Response.builder().company("Iphone").category("Tab").price("$5000").itemName("Tab").build());
            }
        };

虽然我能够实现如下的初始地图

Mono<Map<String, Collection<Response>>> collect = Flux.<Response>fromIterable( responses )
                .collectMultimap( Response::getCompany );

有人知道我如何在这里实现我的目标吗?

【问题讨论】:

  • @MuratOzkan,您的回复很有趣。在 select *, User as tableName from User 上,我得到数据: Flux> data 对于许多表,我需要创建返回一个 Json,我在其中指定表名及其数据。所以我返回: Mono>> alltablesDatas 你知道怎么做吗?谢谢

标签: java project-reactor reactive


【解决方案1】:

我认为collectMultiMap 或collectMap 在这种情况下不会直接帮助您:

  1. collectMultiMap(及其重载)只能返回 Map&lt;T, Collection&lt;V&gt;,这显然与您想要的不同。当然,您可以处理 O(n) 复杂度的结果值集(即映射的 Collection&lt;V&gt; 部分)。

  2. 另一方面,如果您提供值函数,collectMap(及其重载)看起来更有希望。但是,您无权访问其他 V 对象,这将禁止您构建 Collection&lt;V&gt;。

我想出的解决方案是使用reduce;虽然返回类型是: Mono&lt;Map&lt;String, Map&lt;String, List&lt;Response&gt;&gt;&gt;&gt;(注意List&lt;V&gt; 而不是Collection&lt;V&gt;)

return Flux.<Response>fromIterable( responses )
           .reduce(new HashMap<>(), (map, user) -> {
                map.getOrDefault(user.getId(), new HashMap<>())
                        .getOrDefault(user.getEmail(), new ArrayList<>())
                        .add(user);
                return map;
            });

reduce 中HashMap 的完整类型是HashMap&lt;String, Map&lt;String, List&lt;AppUser&gt;&gt;&gt;,幸运的是Java 可以从方法的返回类型或分配变量的类型推断出这一点。

【讨论】:

  • 在这段代码中,您在哪里向地图添加新条目?看起来地图返回的大小为 0
猜你喜欢
  • 1970-01-01
  • 2019-07-01
  • 2018-12-19
  • 2019-11-14
  • 2018-05-01
  • 2017-07-14
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
相关资源
最近更新 更多