Lorsque vous exécutez le code suivant compilé sur 8 JDK l'exception est lancée
java.lang.IllegalStateException: La clé en double 1
ce qui indique que même si la nouvelle clé est censé être un objet différent d'un type différent, l'exception mentionne encore l'objet original.
List<Integer> ints = ImmutableList.of(1, 1);
Map<String, Integer> m = ints.stream()
.collect(Collectors.toMap(intgr -> String.valueOf(intgr + 1), Function.identity()));
La fonction de mappage peut être arbitrairement des objets complexes et totalement différents finissent par être mis en correspondance avec la même clé, pourquoi choisir ce comportement d'exception?
Je veux dire, pourquoi l'exception levée est pas « clé en double 2 »?
Remarque: dans notre cas , la valeur d' origine qui a été mis en correspondance est une classe tierce partie sans la toString
mise en œuvre de sorte qu'il était impossible de savoir ce qui a causé la duplication.
Cela pourrait être un bug jdk. Je pense qu'il peut être résolu dans la version supérieure. (J'utilise 1.8_162)
Vous pouvez voir Collectors#throwingMerger
.
private static <T> BinaryOperator<T> throwingMerger() {
return (u,v) -> { throw new IllegalStateException(String.format("Duplicate key %s", u)); };
}
Alors que le paramètre d'entrée u, v
est de venir Map#merge
. Il est l'ancienne valeur et la nouvelle valeur. Il est donc 1, 1
dans votre cas. Mais le message d'erreur est Duplicate key
, il est tout à fait tort , car les deux u
et v
n'est pas clé , mais la valeur.
ÉDITER
jdk Vérifié 10, ce bug a été corrigé.
Maintenant Collectors.toMap
utiliser sa propre fonction accumulate plutôt que d' utiliser Map.merge
.