我在响应下面有一个响应通道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 );
有人知道如何在这里实现我的目标。
答案 0 :(得分:0)
在这种情况下,我不认为collectMultiMap
或collectMap
可以直接帮助您:
collectMultiMap
(及其重载)只能返回Map<T, Collection<V>
,这明显不同于您想要的内容。当然,您可以使用O(n)复杂度处理结果值集(即地图的Collection<V>
部分)。
另一方面,collectMap
(及其重载)看起来更有前途,如果你提供值函数。但是,您无权访问其他V
个对象,这些对象禁止您构建Collection<V>
。
我想出的解决方案是使用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;
});
HashMap
中reduce
的完整类型是HashMap<String, Map<String, List<AppUser>>>
,谢天谢地,Java可以从方法的返回类型或指定变量的类型推断出它。