Lambda&Stream:在地图中收集

时间:2018-10-10 13:35:14

标签: java lambda java-8 hashmap java-stream

我想使用Stream&Lambda对构建地图。

我已经尝试了很多方法,但是我陷入了困境。这是使用Stream / Lambda和经典循环实现的经典Java代码。

val n: Int = 10
val arr = Array(n, { it } )
val i: Int = 0
println(arr[i])

如您所见,我只知道如何在列表中进行收集,但是我无法对地图进行相同的处理。这就是为什么我必须再次流式传输列表以构建第二个列表,以便最终将所有列表放到地图中的原因。 我也尝试过'collect.groupingBy'语句,因为它也应该生成地图,但是我失败了。

1 个答案:

答案 0 :(得分:6)

似乎您想将pprsToBeApproved列表上的内容映射到您的Funder实例,并按照买方Entity对其进行分组。

您可以执行以下操作:

Map<Entity, List<Funder>> initMap = pprsToBeApproved.stream()
    .collect(Collectors.groupingBy(
        fr -> fr.getBuyerIdentification().getBuyer().getEntity(), // group by this
        Collectors.mapping(
            fr -> fr.getDocuments().get(0).getFunder(), // mapping each element to this
            Collectors.toList())));                     // and putting them in a list

如果您不想为特定实体提供重复的资助者,则可以将其收集到集合图中:

Map<Entity, Set<Funder>> initMap = pprsToBeApproved.stream()
    .collect(Collectors.groupingBy(
        fr -> fr.getBuyerIdentification().getBuyer().getEntity(),
        Collectors.mapping(
            fr -> fr.getDocuments().get(0).getFunder(),
            Collectors.toSet())));

这与Collectors.groupingBy一起使用Collectors.mapping