gpt4 book ai didi

java - 如何用带有流的LinkedhashMap替换HashMap?

转载 作者:行者123 更新时间:2023-12-02 01:50:34 25 4
gpt4 key购买 nike

您能帮我对 map 进行排序吗?

我有以下结构,我想在 LinkedHashMap 中以按值相反的顺序组装客户下的应用程序。

[{
"CUSTOMER_1": {
"APP_1": "1"
},
"CUSTOMER_2": {
"APP_1": "2",
"APP_3": "7",
"APP_2": "3"
}
}]

我已经有一个组装 map 的 lambda:

 final Map<String, Map<String, Long>> organizationApps = taskHandles.stream().map(this::mapPayload)
.flatMap(e -> e.entrySet().stream())
.collect(groupingBy(Map.Entry::getKey, of(HashMap::new,
(r, t) -> t.getValue().forEach((k, v) -> r.merge(k, v, Long::sum)),
(r1, r2) -> {
r2.forEach((v1, v2) -> r1.merge(v1, v2, Long::sum));
return r1;
}))
);

我现在需要的是将 HashMap 表示的 organizationApps 值替换为 LinkedHashMap 并将这些值放入 LinkedHashMap 以正确的顺序。

如何在 lambda 中做到这一点?

更新:

我可以使用以下代码实现必要的输出:

    final Map<String, Map<String, Long>> organizationApps = taskHandles.stream().map(this::mapPayload)
.flatMap(e -> e.entrySet().stream())
.collect(groupingBy(Map.Entry::getKey, of(HashMap::new,
(r, t) -> t.getValue().forEach((k, v) -> r.merge(k, v, Long::sum)),
(r1, r2) -> {
r2.forEach((v1, v2) -> r1.merge(v1, v2, Long::sum));
return r1;
}))
);

organizationApps.forEach((key, value) -> {
final Map<String, Long> sorted = value.entrySet()
.stream()
.sorted(reverseOrder(Map.Entry.comparingByValue()))
.collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2,
LinkedHashMap::new));
organizationApps.put(key, sorted);
});

如何在一个 lambda 中完成它?

最佳答案

在创建按结果值排序的 LinkedHashMap 之前,您无法避免将值收集到映射中,但您可以将转换步骤指定为 finisher 函数您的自定义收集器:

Map<String, Map<String, Long>> organizationApps = input.stream()
.flatMap(e -> e.entrySet().stream())
.collect(groupingBy(Map.Entry::getKey, Collector.of(HashMap::new,
(r, t) -> t.getValue().forEach((k, v) -> r.merge(k, v, Long::sum)),
(r1, r2) -> {
r2.forEach((v1, v2) -> r1.merge(v1, v2, Long::sum));
return r1;
},
(Map<String, Long> m) -> m.entrySet().stream()
.sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
.collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2,
LinkedHashMap::new))
)));

这相当于以下 (Java 9+) 代码

Map<String, Map<String, Long>> organizationApps = input.stream()
.flatMap(m -> m.entrySet().stream())
.collect(groupingBy(Map.Entry::getKey, collectingAndThen(flatMapping(
t -> t.getValue().entrySet().stream(),
toMap(Map.Entry::getKey, Map.Entry::getValue, Long::sum)),
(Map<String, Long> m) -> m.entrySet().stream()
.sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
.collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2,
LinkedHashMap::new))
)));

this answer结尾是 flatMapping 收集器的 Java 8 兼容实现,但您的自定义收集器也可以完成这项工作。

关于java - 如何用带有流的LinkedhashMap替换HashMap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53037329/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com