Java 8 toMap IllegalStateException Duplicate Key

2022-08-31 16:26:16

我有一个文件,其中包含以下格式的数据

1
2
3

我想将此加载到地图中{(1->1), (2->1), (3->1)}

这是Java 8代码,

Map<Integer, Integer> map1 = Files.lines(Paths.get(inputFile))
                .map(line -> line.trim())
                .map(Integer::valueOf)
                .collect(Collectors.toMap(x -> x, x -> 1));

我收到以下错误

Exception in thread "main" java.lang.IllegalStateException: Duplicate key 1

如何修复此错误?


答案 1

pramodh的答案很好,如果你想将你的值映射到1。但是,如果您不想始终映射到常量,则使用“合并函数”可能会有所帮助:

Map<Integer, Integer> map1 = Files.lines(Paths.get(inputFile))
                .map(line::trim())
                .map(Integer::valueOf)
                .collect(Collectors.toMap(x -> x, x -> 1, (x1, x2) -> x1));

上面的代码与问题中发布的代码几乎相同。但是,如果它遇到 一个 ,而不是抛出一个异常,它将通过应用 merge 函数来解决它,通过获取第一个值。duplicate key


答案 2

如果文件中没有重复项,代码将运行。

Map<Integer, Integer> map1 = Files.lines(Paths.get(inputFile))
            .map(String::trim)
            .map(Integer::valueOf)
            .collect(Collectors.toMap(x -> x, x -> 1));

如果存在重复项,请使用以下代码获取该文件中该项的出现总数。

Map<Integer, Long> map1 = Files.lines(Paths.get(inputFile))
            .map(String::trim)
            .map(Integer::valueOf)
            .collect(Collectors.groupingBy(x -> x, Collectors.counting());

推荐