2017-04-10 334 views
1

如何重寫這種舊式代碼以使用Java 8流?我知道這可以通過一行代碼來完成。將映射列表轉換爲使用帶有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

需要兩個以上的參數'toMap()'來產生一個'LinkedHashMap'。 – Andreas

+1

@Andreas,是的,這是正確的。 –

+1

從技術上講,這是不一樣的,因爲你現在拋出重複鍵的異常。在原始代碼中,最後一個'put()'贏了,所以合併函數也應該這樣做。請參閱[我的答案](http://stackoverflow.com/a/43333222/5221149),它也可以在一行*中執行,就像OP問的一樣。 ;-)不過,+1擊敗了我。 – Andreas