Не удалось объединить с картой - PullRequest
1 голос
/ 25 марта 2019

Я пытаюсь объединить несколько карт в одну карту, для этого я написал этот фрагмент кода.

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

Заранее спасибо.

...