2017-04-10 13 views
1

Java 8ストリームを使用するこの古いスタイルのコードを書き換えるにはどうすればよいですか?私はストリームコードの1行でこれを行うことができることを知っています。Java 8ストリームでImmutablePairを使用するマップにマップのリストを変換する

Map<String, ImmutablePair<Double, Double>> dataCache = new LinkedHashMap<>() 
List<Map<String, Object>> data = new ArrayList<>(); 
for(Map<String, Object> rec : data) { 
    String code = (String) rec.get("code"); 
    Double x0 = (Double) rec.get("x0"); 
    Double x1 = (Double) rec.get("x1"); 
    dataCache.put(code, new ImmutablePair<>(x0, x1)); 
} 

本質的には、レコードの一般的なリストをより構造化されたハッシュ検索に再マップすることです。

+1

を[なぜ、誰かが助けることができる」であります私?実際の質問ではありませんか?](http://meta.stackoverflow.com/q/284236) –

答えて

3

をしたい:

Map<String, ImmutablePair<Double, Double>> dataCache = data.stream().collect(Collectors.toMap(rec -> (String) rec.get("code"), rec -> new ImmutablePair<>((Double) rec.get("x0"), (Double) rec.get("x1")), (a, b) -> b, LinkedHashMap::new)); 
3
Map<String, ImmutablePair<Double, Double>> dataCache = data.stream() 
    .collect(
     Collectors.toMap(
      rec -> (String) rec.get("code"), 
      rec -> new ImmutablePair<>(
       (Double) rec.get("x0"), (Double) rec.get("x1")))); 

あなたがマップの実装を気にしている場合、あなたはおそらくあなたは、ストリームコードの単一ラインたいので

Map<String, ImmutablePair<Double, Double>> dataCache = data.stream() 
    .collect(
     Collectors.toMap(
      rec -> (String) rec.get("code"), 
      rec -> new ImmutablePair<>(
       (Double) rec.get("x0"), (Double) rec.get("x1")), 
      (p1, p2) -> { throw new IllegalArgumentException(); }, 
      LinkedHashMap::new)); 
+2

'LinkedHashMap'を生成するには、toMap()に2つ以上のパラメータが必要です。 – Andreas

+1

@Andreasはい、そうです。 –

+1

技術的には、これは同じではありません。重複したキーに対して例外がスローされるためです。元のコードでは、最後の 'put()'が勝つので、マージ関数もそれを行うべきです。 [私の答え](http://stackoverflow.com/a/43333222/5221149)も参照してください。これは、OPのように1行で*行います。 ;-)それでも、私はパンチに私を打つため+1。 – Andreas

関連する問題