无法合并到Map <string,long =“”>

时间:2019-03-25 12:59:36

标签: collections java-8

我试图将多个Map合并为一个Map,为此,我编写了这段代码。

public static Map<String, Long> mergeMaps(List<Map<String, Long>> maps){
    Map<String, Long> mergedMap = new TreeMap<>();
    maps.forEach( map -> {
        //Map<String, Long> mx = new TreeMap<>(map);
        map.forEach((key, value) -> mergedMap.merge(key, value, Long::sum));
    });
    logger.info("Merge map successful");
    return mergedMap;
}

执行此操作时,代码将引发错误:

org.springframework.batch.core.step.AbstractStep java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
    at java.util.LinkedHashMap.forEach(LinkedHashMap.java:684) ~[?:1.8.0_201-1-ojdkbuild]
lambda$mergeMaps$1

我有这个pojo

公共类MappingDto {

public MappingDto(){

    map1 = new LinkedHashMap<>();
    map2 = new LinkedHashMap<>();
    map3 = new LinkedHashMap<>();
}

private Map<String, Long> map1;
private Map<String, Long> map2;
private Map<String, Long> map3;

getters()/Setters()
toString()
}

我用以下代码填充此pojo映射。

MappingDto.setMap1(Arrays.asList(doc.getDescription().split("\\s+")).stream().collect(Collectors.groupingBy(Function.identity(),LinkedHashMap::new,Collectors.counting())));

生成此地图后,我必须将此地图与一些存储在文件中的地图合并,要读取地图,我具有以下方法。

public static <T> T readJsonFile(String filePath, T t) throws JAXBException, IOException, IllegalAccessException, InstantiationException {
    ObjectMapper mapper = new ObjectMapper();
    if(!Utils.checkIfFileExists(filePath)){
        Utils.createANewFile(filePath);
        return t;
    }
    return mapper.readValue(new File(filePath), new TypeReference<T>(){});
}

获取此地图后,将其传递给

mergeMaps(Arrays.asList(MappingDto.getMap1(),storedData));

List<Map<String, Long>> dataList = new LinkedList<>();
dataList.add(MappingDto.getMap1());
dataList.add(MappingDto.getMap2());
dataList.add(MappingDto.getMap3());
mergeMaps(dataList);

我已经看过几次这段代码,但是无法弄清楚到底是什么引起了这个问题。

一个正在读取存储的JSON映射

public static <T> T readJsonFile(String filePath, Class<T> t) throws JAXBException, IOException, IllegalAccessException, InstantiationException {
    ObjectMapper mapper = new ObjectMapper();
    if(!Utils.checkIfFileExists(filePath)){
        Utils.createANewFile(filePath);
        return t.newInstance();
    }
    return mapper.readValue(new File(filePath), new TypeReference<T>(){});
}

我尝试了这种方法以及其他几种方法,但没有结果。

public static Map<String, Long> mergeMaps(List<Map<String, Long>> maps){
    Map<String, Long> mergedMap = new TreeMap<>();
    maps.forEach( map -> {
        //Map<String, Long> mx = new TreeMap<>(map);
        map.forEach((key, value) -> mergedMap.merge(key, Long.valueOf(value), Long::sum));
    });
    logger.info("Merge map successful");
    return mergedMap;
}

能否请您帮助我了解Integer中的内容以及为什么被强制转换为Long

谢谢。

0 个答案:

没有答案