Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 8 两个代码段之间的差异_Java 8_Java Stream_Collectors - Fatal编程技术网

Java 8 两个代码段之间的差异

Java 8 两个代码段之间的差异,java-8,java-stream,collectors,Java 8,Java Stream,Collectors,我已经编写了一个示例lambda代码,现在我想了解一些关于语句的知识 我的示例代码:- public static void main( String[] args ) { List<ItemObject> record = new ArrayList(); ItemObject object1 = new ItemObject(); ItemObject object2 = new ItemObject(); ItemObject object3 =

我已经编写了一个示例lambda代码,现在我想了解一些关于语句的知识

我的示例代码:-

public static void main( String[] args )
{
    List<ItemObject> record = new ArrayList();
    ItemObject object1 = new ItemObject();
    ItemObject object2 = new ItemObject();
    ItemObject object3 = new ItemObject();
    ItemObject object4 = new ItemObject();
    record.add(object1);
    record.add(object2);
    record.add(object3);
    record.add(object4);

    Map<String, ItemObject> stbProcessingMap = new HashMap();
    stbProcessingMap = record.stream().collect(Collectors.toMap(recordingItem -> "key", recordingItem -> recordingItem, (r1,r2) -> r2));
    System.out.println(stbProcessingMap);
}
它的工作很好,但当我使用

stbProcessingMap = record.stream().collect(Collectors.toMap(recordingItem -> "key", recordingItem -> recordingItem, (r1,r2) -> r2));
stbProcessingMap = record.stream().collect(Collectors.toMap(recordingItem -> "key", recordingItem -> recordingItem));
我得到以下错误

Exception in thread "main" java.lang.IllegalStateException: Duplicate key com.modle.ItemObject@7cca494b
at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133)
at java.util.HashMap.merge(HashMap.java:1245)
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:1374)
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)
at com.sample.App.main(App.java:30)

这两条语句之间的区别是什么?第一个示例代码段使用收集器的此重载:

toMap(Function<? super T,? extends K> keyMapper,
               Function<? super T,? extends U> valueMapper,
               BinaryOperator<U> mergeFunction)
toMap​(Function<? super T,? extends K> keyMapper,
              Function<? super T,? extends U> valueMapper)

如果存在键冲突,则会引发异常,因为映射不能有重复的键。

您是否阅读了两个toMap方法的javadoc?很明显!第一种方法使用merge函数放置新值,但第二种方法不使用它,因此它引发异常。事实上,第一种方法使用相同键的新值替换旧值。