将对象列表的列表转换为映射 - 在java 8中使用lambdas

时间:2016-10-24 08:22:43

标签: java lambda java-8 java-stream

我有如下对象结构:

Order {
    int code;
    int id;
    List<Item>;
}

Item {
     int code;
     int quantity;
     List<Suborder>;
}

Suborder {
    int code;
    int quantity;
}

我有一个O的对象,我想要一个从代码到B的地图。这是正确的方法吗?

我尝试了什么:

1 - 不工作

order.getOrderItems().stream().flatMap(l -> l.getOrderItemSuborder().stream()).collect(Collectors.toMap(x -> x.getCode() , Function.identity())); // x.getCode() seems to be not available here  :( 

2 - 工作

order.getOrderItems().forEach(x -> x.getOrderItemSuborder().forEach(y -> suborderMap.put(y.getCode(),y)));

我不确定#2是否是正确的方法。

我如何让#1工作?

P.S。 :从lambdas开始,可能是一个愚蠢的问题,但我不知道如果是:p

1 个答案:

答案 0 :(得分:3)

根据我的理解,我认为你需要这样的东西

O order;
order.getAList().stream()
      .flatMap(a -> a.getBList().stream())
      .collect(toMap(b -> b.getCode(), b -> b));

当你第一次尝试时,你需要的是b -> b,我想你错过了lambda中那部分收集地图