Разница между двумя фрагментами кода - PullRequest
0 голосов
/ 13 июня 2018

Я написал пример кода 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)

в чем разница между этими двумя операторами

1 Ответ

0 голосов
/ 13 июня 2018

В первом примере фрагмента используется эта перегрузка коллектора toMap :

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

, который использует функцию mergeFunction для разрешения столкновений клавиш, поэтому исключение не будет выброшено, тогда какво втором примере фрагмент использует эту перегрузку коллектора toMap :

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

, которая выдает исключение в случае коллизии ключей, поскольку карта не может иметь дублирующихся ключей.

...