2017-01-05 6 views
1

Привет я получаю сообщение об ошибке при выполнении моего кода:Java 8 Список <V> в Map <K, V> переопределяют ключи дублирующих

java.lang.IllegalStateException: Duplicate key [email protected] 
at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133) 
at java.util.HashMap.merge(HashMap.java:1253) 
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 ad.ecs.core.scriptengine.Utils.getInterfaceIDsWithSiteIDAndNPI(Utils.java:689) 

Я пытаюсь группировать мой список на карте:

public static Map<Integer, SiteIDAndNPI> getInterfaceIDsWithSiteIDAndNPI(Session session) { 
    @SuppressWarnings("unchecked") 
    List<Srvsetup> srvsetups = session.createCriteria(Srvsetup.class) 
      .add(Restrictions.gt("scriptinterfaceid", 0)) 
      .list(); 
    Map<Integer, SiteIDAndNPI> interfaceIDs = srvsetups.stream() 
      .collect(Collectors.toMap(srv -> srv.getScriptinterfaceid(), 
        srv -> getSiteIDAndNPI(srv.getId().getSiteid(), session))); 

    @SuppressWarnings("unchecked") 
    List<Facsetup> facsetups = session.createCriteria(Facsetup.class) 
      .add(Restrictions.gt("scriptinterfaceid", 0)) 
      .list(); 
    interfaceIDs.putAll(facsetups.stream() 
      .collect(Collectors.toMap(fac -> fac.getScriptinterfaceid(), 
        fac -> getSiteIDAndNPI(fac.getPlid(), session)))); 
    return interfaceIDs; 
} 

public static SiteIDAndNPI getSiteIDAndNPI(int siteID, Session session) { 
    SiteIDAndNPI siteIDAndNPI = new SiteIDAndNPI(); 
    siteIDAndNPI.setSiteID(siteID); 
    Mdsetup1 mdsetup1 = (Mdsetup1) session.get(Mdsetup1.class, siteID); 
    if (mdsetup1 != null) 
     siteIDAndNPI.setNPI(mdsetup1.getProviderId()); 
    return siteIDAndNPI; 
} 

Я просмотрел эту ссылку: Java 8 List<V> into Map<K, V>

Существует предложение использовать группу. Но я не хочу получать такую ​​карту:

Map<Integer, List<SiteIDAndNPI>> 

Вместо этого я хотел бы переопределить дубликаты ключей. Является ли это достижимым, не делая какой-то уродливый код?

ответ

4

Несомненно. Просто используйте toMap перегрузку принимающих функцию слияния:

Collectors.toMap(fac -> fac.getScriptinterfaceid(), 
       fac -> getSiteIDAndNPI(fac.getPlid(), session, log), 
       (value1, value2) -> value2 /* accept the second version */)) 
0

Попробуйте использовать

list.stream.collect(Collectors.groupingBy(srv::Scriptinterfaceid)) 

Это вернет карту с Scriptinterfaceid как Key & List<srv> в качестве значения.