到地图>,java"/>

首页 > 解决方案 > Java 8 Lambda 映射到地图>

问题描述

我有一个服务返回响应并将其映射到Map<String, String> object

在此之后,我需要计算新地图的键并插入所有出现的键以及它们执行的次数。

它们的键是通过获取关联字符串的第一个字符来计算的。

Key: A -> August/Air

Key: B -> Boat/Big

例子:

服务响应:

{
    {
        "august",
        "red"
    },
    {
        "air",
        "red"
    },
    {
        "boat",
        "blue"
    },
    {
        "big",
        "red"
    }
}

预期输出:

{
    "a" : {
        "red" : 2
    },

    "b" : {
        "blue" : 1,
        "red": 1
    }
}

我已经在 J​​ava 7 中这样做了,但我想将 lambdas 应用于此。

Map<String, Map<String, AtomicLong>> map = new HashMap<>();

String key = ...
String value = ...

Response.incrementCount(key, value);

map.put(key, Response.count.get(key));

响应.java

public static Map<String, Map<String, AtomicLong>> count = new HashMap<>();

public static void incrementCount(String key, String value) {
    count.computeIfAbsent(key, k -> new HashMap<>());

    AtomicLong actual = count.get(key).get(value);
    Map<String, AtomicLong> stringAtomicLongMap = count.get(key);
    if (null == actual) {
        actual = new AtomicLong();
        stringAtomicLongMap.put(value, actual);
        count.put(key, stringAtomicLongMap);
    }
    actual.incrementAndGet();
}

标签: java

解决方案


这是使用 Stream API 的解决方案:

Map<String, Map<String, Long>> resultMap = map.entrySet().stream()
    .map(entry -> {
        String firstChar = entry.getKey().substring(0, 1);
        return new AbstractMap.SimpleEntry<>(firstChar, entry.getValue());
    })
    .collect(Collectors.groupingBy(
        Map.Entry::getKey,
        Collectors.groupingBy(Map.Entry::getValue, Collectors.counting())
    ));

实际发生了什么:

  • 给定条目被更改为只有第一个字符(但作为字符串)作为它们的条目键
  • 此类条目按键(第一个字符)分组
  • 如果此键有多个值 - 它们按条目值分组 - 并计算这些值

推荐阅读