2017-01-05 18 views
1

私のコードを実行しながらこんにちは、私はエラーを取得しています:地図へのJava 8リスト<V><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<srv>としてScriptinterfaceidとのマップを返します

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

を使用してみてください。

関連する問題