我正在开发一个 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
时,我得到的是空地图。
在这种情况下如何使用流有什么建议吗?
这不是正确的方法。
map
是一个中间操作(即,它被延迟评估)并且您没有终端操作,因此它永远不会被评估。您应该 collect
将数据放入 Map
:
Map<Long, PickingDetails> pickingDetailsDTOMap =
pickingJobModels.stream()
.collect(Collectors.toMap(pm -> pm.getPickListDTO().getReferenceId(),
pm -> getPickingDetails(pm)));
创建流时,您创建了操作的定义。对于流中传输的每个元素,这些操作将被一个接一个地执行。
这就像设置人员并给他们指示。第一个,流的源有指令:如果站在你右边的下一个人向你请求一个值,请向他们提供此数组、集合或任何流源中的下一个元素。
下面做“map”的人得到指令:每当站在你右边的人向你询问一个值时,你首先向站在你左边的人请求一个值,对该值进行map操作,然后把人交给右边。
排中的最后一个人,终端操作员是唯一收到指令的人:主动向你左边的人询问值并收集这些值。
您向两个人发出指令,但没有执行流的终端操作。
流是从右向左执行的。如果没有终端操作,那么什么也不会发生。