2017-04-10 337 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