如何生成单色<map <map <list>&gt;来自Flux

时间:2018-05-05 06:37:13

标签: java project-reactor reactive

我在响应下面有一个响应通道Flux.<Response>fromIterable(responses)。我想将其转换为地图的Mono,如下所示:

  

单声道&LT;地图&LT;字符串,地图&lt;字符串,集合&lt;响应&GT;&GT;&GT;&GT; collectMap =?

其中公司是第一个密钥,其中将生成另一个响应图,其中类别为密钥。

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

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

1 个答案:

答案 0 :(得分:0)

在这种情况下,我不认为collectMultiMapcollectMap可以直接帮助您:

  1. collectMultiMap(及其重载)只能返回Map<T, Collection<V>,这明显不同于您想要的内容。当然,您可以使用O(n)复杂度处理结果值集(即地图的Collection<V>部分)。

  2. 另一方面,collectMap(及其重载)看起来更有前途,如果你提供值函数。但是,您无权访问其他V个对象,这些对象禁止您构建Collection<V>

  3. 我想出的解决方案是使用reduce;虽然返回类型是: Mono<Map<String, Map<String, List<Response>>>>(请注意List<V>而不是Collection<V>

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

    HashMapreduce的完整类型是HashMap<String, Map<String, List<AppUser>>>,谢天谢地,Java可以从方法的返回类型或指定变量的类型推断出它。