2017-07-26 8 views
2

Guava Multimap<String ,Collection<String>>Map<String, Collection<String>>に変換しようとしていますが、Multimaps.asMap(multimap)を使用すると構文エラーが発生します。ここでは、コードは次のようになります。ここではGuava HashMultmapをjava.util.Mapに変換する方法

HashMultimap<String, Collection<String>> multimap = HashMultimap.create(); 
for (UserDTO dto : employees) { 
    if (dto.getDepartmentNames() != null) { 
     multimap.put(dto.getUserName().toString().trim(), dto.getDepartmentNames()); 
    } 
} 
Map<String, Collection<String>> mapOfSets = Multimaps.asMap(multimap); 

は、エラーのスクリーンショットです: enter image description here

誰かが私がミスをやっているところを指摘することはできますか?

+1

'Map '? – RealSkeptic

+0

私が返すメソッドは、Map >を返すので、同じ戻り値の型が必要です。 – user565

+0

私はすでにこれをチェックしています。私のインポートはすべてguava APIを使用していません。 – user565

答えて

2

戻りタイプMultimaps.asMap(multimap)Map<String, <Set<Collection<String>>です。

マルチマップは同じキーの複数の値を保持できます。したがって、マルチマップからマップに変換する場合は、各キーの値のコレクションを保持する必要があります。その場合、マップにキーが2回表示されます。

あなたはMultiMapからMapに変換したいと値に設定された合計を作る場合は、次の操作を行うことができます。

Multimaps.asMap(multimap).entrySet().stream() 
    .collect(Collectors.toMap(
       Map.Entry::getKey, 
       e->e.getValue().stream() 
         .flatMap(Collection::stream).collect(toSet()))); 
+0

@xentrosヒントをありがとう。 Map >> mapOfSets = Multimaps.asMap(マルチマップ)で動作します。私はまだ私のメソッドシグネチャが異なるので、Map >をこれから取得する方法が混乱していますか? – user565

+0

@ user565私が書いたコードを理解していますか? – xenteros

+0

はい、私はそれを得ました。私のプロジェクトでグアバのバージョン管理に関する問題があります。残りは完璧な実装であるようです。 – user565

0

私はあなたがMultimap間違っを使用している、ここで何をやっていると思います。 Multimap<String, Collection<String>>はおおよそMap<String, Collection<Collection<String>>>に相当するため、asMapビュー(例:{user1=[[IT, HR]], user2=[[HR]], user3=[[finance]]})を使用するとネストされたコレクションになります。そしてMultimap#putAll(K, Iterable<V>)を使用します(代わりにSetMultimap#asMap()Multimaps#asMap(SetMultimap)が原因Javaの型システムの制限に必要な使用

SetMultimap<String, String> multimap = HashMultimap.create(); 
for (UserDTO dto : employees) { 
    if (dto.getDepartmentNames() != null) { 
     // note `.putAll` here 
     multimap.putAll(dto.getUserName().toString().trim(), dto.getDepartmentNames()); 
    } 
} 
Map<String, Set<String>> mapOfSets = Multimaps.asMap(multimap); 
// ex. {user1=[HR, IT], user2=[HR], user3=[finance]} 

をすることはできません。

は、何が本当に欲しいのは(Map<String, Set<String>>に対応SetMultimap<String, String>より具体的に)Multimap<String, String>を使用することです

Note: The returned map's values are guaranteed to be of type Set . To obtain this map with the more specific generic type Map<K, Set<V>> , call Multimaps.asMap(SetMultimap) instead.

関連する問題