将映射列表转换为使用ImmutablePair和Java8流的映射

将映射列表转换为使用ImmutablePair和Java8流的映射,java,lambda,java-8,java-stream,Java,Lambda,Java 8,Java Stream,如何重写这种旧式代码以使用Java8流?我知道它可以用一行流代码来完成 Map<String, ImmutablePair<Double, Double>> dataCache = new LinkedHashMap<>() List<Map<String, Object>> data = new ArrayList<>(); for(Map<String, Object> rec : data) { S

如何重写这种旧式代码以使用Java8流?我知道它可以用一行流代码来完成

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));
}
Map dataCache=newlinkedhashmap()
列表数据=新的ArrayList();
用于(地图记录:数据){
字符串代码=(字符串)rec.get(“代码”);
Double x0=(Double)rec.get(“x0”);
双x1=(双)记录获取(“x1”);
put(代码,新的不可变对(x0,x1));
}
其基本思想是将一个通用记录列表重新映射到一个更结构化的哈希查找中

Map dataCache=data.stream()
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"))));
.收集( 汤姆( rec->(字符串)rec.get(“代码”), rec->newimmutablepair( (Double)rec.get(“x0”),(Double)rec.get(“x1”);
如果您关心map的实现,您可能需要

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));
Map dataCache=data.stream()
.收集(
汤姆(
rec->(字符串)rec.get(“代码”),
rec->newimmutablepair(
(双)记录获取(“x0”),(双)记录获取(“x1”),
(p1,p2)->{抛出新的IllegalArgumentException();},
LinkedHashMap::new));
Map dataCache=data.stream()
.收集(
汤姆(
rec->(字符串)rec.get(“代码”),
rec->newimmutablepair(
(Double)rec.get(“x0”),(Double)rec.get(“x1”);
如果您关心map的实现,您可能需要

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));
Map dataCache=data.stream()
.收集(
汤姆(
rec->(字符串)rec.get(“代码”),
rec->newimmutablepair(
(双)记录获取(“x0”),(双)记录获取(“x1”),
(p1,p2)->{抛出新的IllegalArgumentException();},
LinkedHashMap::new));
因为您需要一行流代码:

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));
Map dataCache=data.stream();
因为您需要一行流代码:

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));
Map dataCache=data.stream();

还需要两个参数才能
toMap()
生成
LinkedHashMap
。从技术上讲,这是不同的,因为您现在对重复键抛出异常。在原始代码中,last
put()
获胜,所以合并函数也应该这样做。看,这也可以在一行中完成,就像OP提问一样尽管如此,还是+1,因为我赢了。@Andreas,这不是一行吗?这是一条语句,包含了8行源代码。;-)需要另外两个参数来
toMap()。在原始代码中,last
put()
获胜,所以合并函数也应该这样做。看,这也可以在一行中完成,就像OP提问一样尽管如此,还是+1,因为我赢了。@Andreas,这不是一行吗?这是一条语句,包含了8行源代码。;-)