2017-10-10 1 views
6

エラー

String[] values = ... 
.... 
Map<String, Object> map = new HashMap<>(); 
for (int i = 0; i < values.length; i++) { 
    map.put("X" + i, values[i]); 
} 

はIntelliJので変換された次のコードとをマッピングしますtコンパイルします。

IntelliJのは、[i]の値の私の問題があることがヒント:

Incompatible types.
Required: int
Found: java.lang.Object

コンパイラは文句:

Error:(35, 17) java: method collect in interface java.util.stream.IntStream cannot be applied to given types;
required: java.util.function.Supplier,java.util.function.ObjIntConsumer,java.util.function.BiConsumer
found: java.util.stream.Collector>
reason: cannot infer type-variable(s) R
(actual and formal argument lists differ in length)

誰もが理由を説明することはできますか?

+0

あなたはその宣言も含めることができますか? IntelliJの提案にも、一貫性がないようです。宣言とループの間にprint 'map'ステートメントを置くだけです。 *あなたはcollect *で置き換えることを提案しません。 – nullpointer

+1

String [] values = ... – msayag

+0

'Collector'はプリミティブをサポートしていないと思うので、' boxed() 'はそれを修正するので、lambdaが' Object'に変換されているのかもしれません。 –

答えて

2

intelliJの提案がそこでどのように機能するかはあまり知られていませんが、矛盾しているようです。ただ、宣言とループの間

System.out.print(map); 

文を入れて、それはあなたが任意のさらなる収集と交換示唆しています。


IntStream#collect

を使用している間、コンパイル

Collectors.toMap(i -> "X" + i, i -> values[i]) 

が単一の引数をもたらすであろうしながらcollect方法の実装は同様にエラーに見えるように指定された3つの引数を期待する理由で失敗しましたタイプCollectorです。

- :

  • のいずれかにとしてStream<Integer>forEach

    Map<String, Object> map; 
    IntStream.range(0, values.length).forEach(i -> map.put("X" + i, values[i])); 
    
  • を使用するか、IntStreamを変換するboxed()を使用しても式を変換する


    良い方法は次のようになります

    Map<String, Object> map = IntStream.range(0, values.length).boxed() 
          .collect(Collectors.toMap(i -> "X" + i, i -> values[i], (a, b) -> b)); 
    
  • それとも@Holgerによって提案されたとして、あなたはのforEachとボクシングのオーバーヘッドを使用して回避してIntStream.collect 3-argの変種を利用するために構造を変更することができます: - `の値が何であるかを

    Map<String, Object> map = IntStream.range(0, values.length) 
          .collect(HashMap::new, (m,i) -> m.put("X"+i,values[i]), Map::putAll); 
    
+0

私は最初のものを使用します。 2番目の方法は、 'boxed'を使うと、' Integer'とintの間にあまりに多くのボックスとunboxを作成します。 – Shirkam

+0

あなたのソリューションは有効ですが、私の質問には答えられません。それはなぜコンパイルできないのですか? – msayag

+0

@msayag編集されました。しかし、ログは自明であると考えていた。一方、Boxedを使用すると 'IntStream'が' Stream'に変換され、 'collect'がそのクラスでオーバーロードされ、渡された' Collector'を受け入れます。 – nullpointer

関連する問題