2016-11-07 1 views
-1

私はCSVファイルからデータを取得するJavaプログラムを作成しています。データの各行に対して、対応するヘッダーをキーとして各データ要素をマップに配置する必要があります。たとえば、headerRow [7]とdataElements [7]はマップ内のキーと値のペアでなければなりません。以下はJava 8では、一度に2つの配列を反復処理するにはどうすればよいですか?

は、私は伝統的にJavaを使用して、それを記述してコードです:

private Map<String, Double> readLine(String[] headerRow, String[] dataElements) { 
    Map<String, Double> headerToDataMap = new HashMap<>(); 
    for (int i=0; i < nextLine.length; i++) { 
     headerToDataMap.put(headerRow[i], Double.valueOf(dataElements[i])); 
    } 
    return headerToDataMap; 
} 

は、私は、Java 8つのストリームを使用してこのコードを書くことができる方法はあります - 私は2つのアレイに反復するよ心の中で保管同時に?

+0

残念ながら全くジップ方法組み込み – flakes

答えて

5

あなたはバニラのJava 8でこれを取得することができます最も近いものは、おそらくあなたはBiFunctionインターフェースを使用して、ほんの少し長く何かを作ることができ

IntStream.range(0, nextLine.length()) 
    .boxed() 
    .collect(toMap(i -> headerRow[i], i -> dataElements[i])); 
+1

はありませんない 'headerRow :: []' +1 –

+1

@PeterLawreyは存在しませんまた、それはきちんとした表記になると思っています。 – flakes

+0

Guava 21には 'Streams.zip'がありますが、後で' Map'に変換することはこれ以上に良いことではありません。 –

1

だろう。

private Map<String, Double> readLine(String[] headerRow, String[] dataElements) { 
     Map<String, Double> headerToDataMap = new HashMap<>(); 
     BiFunction<String,String, KeyValue> toKeyValuePair = (s1,s2) -> new KeyValue(s1,s2); 
     IntStream.range(0, nextLine.length) 
       .mapToObj(i -> toKeyValuePair.apply(headerRow[i], dataElements[i])) 
       .collect(Collectors.toList()) 
       .stream() 
       .forEach(kv -> { 
        headerToDataMap.put(kv.getKey(), Double.valueOf(kv.getValue())); 
       }); 
     return headerToDataMap; 
    } 

です。KeyValueタイプは、単純なキー値インスタンス生成である(以下のコード)

private class KeyValue { 
     String key; 
     String value; 
     public String getKey() { 
      return key; 
     } 
     public void setKey(String key) { 
      this.key = key; 
     } 
     public String getValue() { 
      return value; 
     } 
     public void setValue(String value) { 
      this.value = value; 
     } 
     public KeyValue(String key, String value) { 
      super(); 
      this.key = key; 
      this.value = value; 
     } 
     public KeyValue() { 
      super(); 
     }  
    } 
+0

これは本当に不思議なようにねじれたストリームの使い方です。中間の '.collect(Collectors.toList()).stream()'ステップのポイントは何ですか?操作に役立つものは何も追加せず、オーバーヘッドのみを追加します。単に両方を削除することができます。さらに、 'collect'について知っているなら、なぜ最後に' forEach'に頼るのですか?そしてなぜ 'BiFunction'を最初に作成して、' mapToObj'ステップのラムダ式に意図したコードを書くのではなく、別のラムダ式で使うのですか? – Holger

+0

@Holgerあなたの発言に感謝します。私はそれらをできるだけ早く調べる – alainlompo

関連する問題