2017-01-05 4 views
1

안녕 내 코드를 실행하는 동안 오류를 받고 있어요 :자바 (8) 목록 <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

확실히.

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

이 값으로 키 & List<srv>로 Scriptinterfaceid와지도를 반환합니다

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

이 사용해보십시오 : 그냥 병합 기능을 수락 toMap 오버로드를 사용합니다.