なぜ、元のオブジェクトに重複するキーをマップコレクタースローJavaのでしょう

ヴィック:

JDK 8上でコンパイル、次のコードを実行したときにスローされる例外です

java.lang.IllegalStateException:重複キー1

これは新しいキーが異なるタイプの異なるオブジェクトことになっているにもかかわらず、例外はまだ元のオブジェクトに言及していることを示しています。

List<Integer> ints = ImmutableList.of(1, 1);
Map<String, Integer> m = ints.stream()
    .collect(Collectors.toMap(intgr -> String.valueOf(intgr + 1), Function.identity()));

マッピング機能は、任意の複雑なとは全く異なるオブジェクトが同じキーにマッピングされて終わることができ、なぜこの例外動作が選択されることでしょうか?

スローされた例外は、「重複キー2」ではありませんなぜ私が意味ですか?

注:私たちの場合にマッピングされた元の値がなくて、サードパーティのクラスであるtoString、重複の原因を知ることは不可能だったような実装。

ディーン徐:

これは、JDKのバグである可能性があります。私はそれが上位バージョンで解決することができると思います。(私は1.8_162を使用しています)

あなたは見ることができますCollectors#throwingMerger

private static <T> BinaryOperator<T> throwingMerger() {
    return (u,v) -> { throw new IllegalStateException(String.format("Duplicate key %s", u)); };
}

一方で、入力パラメータがu, vから来ていますMap#mergeこれは、古い値と新しい値です。だから、ある1, 1あなたのケースで。しかし、エラーメッセージはDuplicate key、両方のために、それは完全に間違っている、uとはv、キーが、値ではありません。

EDIT

チェックJDK 10は、このバグは修正されました。

参照してくださいhttps://github.com/XDean/openjdk/blob/67672eec97164de10a9ca83ddbcef6b42816ed04/src/java.base/share/classes/java/util/stream/Collectors.java#L174を

今すぐCollectors.toMap使用するのではなく、独自の蓄積機能を使用しますMap.merge

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=179832&siteId=1