JDK8 stream toMap() java.lang.IllegalStateException:Duplicate key異常解決(key繰返し)

1758 ワード

テストはまたバグを報告しました


テストパートナーの问题を受けて、1つのインタフェースがデータを返さないと言って、いいでしょう、私が书いたインタフェースの任务が头に落ちても解决しなければなりませんが、地元のデバッグをして、いいやつ、直接异常を投げて、これはまたどの兄が酔っ払って书いたコードです...
    Exception in thread "main" java.lang.IllegalStateException: Duplicate key 
    at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133)
    at java.util.HashMap.merge(HashMap.java:1254)
    at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
    at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)

key繰返し異常解決


エラーを報告した行のコードは次のとおりです.
Map entityMap= entityList.stream().collect(Collectors.toMap(Entity::getType, (entity) -> entity));

この行のコードの目的は、リストオブジェクトをmapオブジェクトに変換し、typeをkey、entityオブジェクトをvalueにすることです.しかし、通常の方法とは異なり、java 8のstream方式をそのまま使用していることも明らかであり、key繰返し、すなわちtoMap方式を使用する場合、繰返しtype値がこの誤りを招いており、最終的な解決策は以下の通りである.
Map entityMap= entityList.stream().collect(Collectors.toMap(Entity::getType, Function.identity(),(entity1,entity2) -> entity1));

TOMap()のリロードメソッドを使用して、キーの重複を回避するために既存の場合は変更しません.
ちなみにツッコミを入れて、これはもうどのくらい前のコードで、どうして今日やっとこの間違いを報告して、酔っ払っています.