2016-04-13 10 views
2
Function<Map<?,List>,Integer> countMap = (Map)->{ 
    Integer count = 0; 
    for(Object key:Map.keySet()){ 
     count+=Map.get(key).size(); 
    } 
    return count; 
}; 
Integer test = countMap.apply(containedAssets); 

コンパイルエラー:apply(java.util.Map<?,List>> in Function cannot be applied to java.util.Map<java.util.String,List<myClass>>が表示されます。この種の操作はFunctionで禁止されていますか?私はMapを使わずに、リストを使っていろいろなコードを試してみました。Javaはどんなタイプのリストにも問題ありませんでした。java.util.Functionへのジェネリックの適用

+0

? – Tunaki

+2

'Function >、Integer> countMap ' –

+2

副作用として、関数が' Integer'を返すという理由だけで、関数内のローカル変数に 'Integer'を使う必要はありません。すべての中間結果をボクシングするのではなく、最終結果をボックス化するのに十分なだけで 'int'を使うことができます。さらに、値を繰り返し処理できるときには、すべてのマッピングに対して 'Map.get'を呼び出すためにキーを繰り返し処理しないでください(https://docs.oracle.com/javase/8/docs/api/java/util/ Map.html#values--) – Holger

答えて

6

それはあなたが望むものに見えますがMap<K, List<V>>に含まれるすべてのリストのサイズの大きさの合計を返す関数を作成することです。その場合

、あなたは私たちが代わりにFunction<...,Integer>の、整数を返す関数としてToIntFunction使用することができます

ToIntFunction<Map<?, ? extends List<?>>> function = 
    map -> map.values().stream().mapToInt(List::size).sum(); 

を持つことができます。次に、残りのメソッドはStream APIでより簡単な方法で記述できます。マップの値を取得し、それらの値のそれぞれをサイズで構成されたIntStreamにマップし、要素を合計します。

+0

それは'? '.size()'はコレクションから来るので、リストの代わりにCollection 'を拡張します – Ferrybig

5

あなたのFunctionはが生のもので、Map<?,List>となると宣言しました。ただし、エラーメッセージからList<myClass>を渡しています。

すなわち通常のJavaの命名規則を以下、typeパラメータList<myClass>であなたのFunctionを宣言します。

Function<Map<?,List<MyClass>>,Integer> countMap = (map)->{ 

のみsize()が呼び出され、FunctionListがそうなるように、何であるかの種類のパラメータを気にしないのでコメントに記載されているように、より柔軟に、? extends List<?>に置き換えることができます。

Function<Map<?, ? extends List<?>>, Integer> countMap = (map)->{ 
+2

または?タイプがわからない場合はリストを拡張します。 –

+0

リストサイズだけが関係するので、 'List 'が可能です。 –

+1

@ Jean-FrançoisSavardあなたが正しいです、あなたのオプションはより柔軟に使用することができます。私は編集します。 – rgettman

4

あなたがマップキーの種類を気にし、リストタイプしていないとして、次のように、あなたはあなたの関数を宣言することができます。

Function<Map<?, ? extends List<?>>, Integer> countMap; 

それは意味:キーはの任意の型と値であるマップを取りますタイプはの任意のクラス拡張リストで、いずれもタイプであり、Integer値を生成します。

そして、私は単に、リストの合計サイズを取得するための別の方法をお勧めしたい:あなたが正確に何をしたいかどう

countMap = m -> m.values().stream().mapToInt(List::size).sum(); 
関連する問題