使用流而不是for循环来创建Map

问题描述 投票:0回答:2

我正在开发一个 Java 项目,我必须迭代一个列表,并根据该列表中的计算将值放入新映射中。

这是使用基本 for 循环的工作原理:

   Map<Long, PickingDetails> pickingDetailsDTOMap = new HashMap<>();
   for(int i=0;i<pickingJobModels.size();i++)
    {
pickingDetailsDTOMap.put(pickingJobModels.get(i).getPickListDTO().getReferenceId(),getPickingDetails(pickingJobModels.get(i)));
     }

但我想用流来做到这一点,所以我这样做了:

pickingJobModels.stream().map(pickingJobModel -> pickingDetailsDTOMap.put(pickingJobModel.getPickListDTO().getReferenceId(),getPickingDetails(pickingJobModel)));

但是当我返回那个

pickingDetailsDTOMap
时,我得到的是空地图。

在这种情况下如何使用流有什么建议吗?

java dictionary lambda java-stream collectors
2个回答
5
投票

这不是正确的方法。

map
是一个中间操作(即,它被延迟评估)并且您没有终端操作,因此它永远不会被评估。您应该
collect
将数据放入
Map
:

Map<Long, PickingDetails> pickingDetailsDTOMap = 
    pickingJobModels.stream()
                    .collect(Collectors.toMap(pm -> pm.getPickListDTO().getReferenceId(),
                                              pm -> getPickingDetails(pm)));

2
投票

创建流时,您创建了操作的定义。对于流中传输的每个元素,这些操作将被一个接一个地执行。

这就像设置人员并给他们指示。第一个,流的源有指令:如果站在你右边的下一个人向你请求一个值,请向他们提供此数组、集合或任何流源中的下一个元素。

下面做“map”的人得到指令:每当站在你右边的人向你询问一个值时,你首先向站在你左边的人请求一个值,对该值进行map操作,然后把人交给右边。

排中的最后一个人,终端操作员是唯一收到指令的人:主动向你左边的人询问值并收集这些值。

您向两个人发出指令,但没有执行流的终端操作。

流是从右向左执行的。如果没有终端操作,那么什么也不会发生。

© www.soinside.com 2019 - 2024. All rights reserved.