如何从java中的Collectors.groupingBy返回不可修改的地图?

所以我有一个以 Long 作为键和一个列表作为值的映射。我希望每个条目中的地图和列表都是不可修改的。

Map<Long, List<VariantValueDto>> variantValues = productVariantValues.stream()
    .map(p -> new VariantValueDto(
        p.getProductVariantId(), p.getOptionId(), p.getOptionName(), p.getOptionValueId(), p.getValueName()
    ))
    .collect(Collectors.groupingBy(VariantValueDto::getProductVariantId));

如何返回这样的结果?

回答

对于不可修改的列表,groupingBy将收集器作为可选的第二个参数,因此您可以传递Collectors.toUnmodifiableList(),而不是隐式默认值toList()

对于不可修改的映射,有一个函数collectingAndThen接受一个收集器和一个最后要应用的函数,并返回一个新的收集器。所以你可以把它包装起来groupingBy并调用unmodifiableMap它。

Map<Long, List<VariantValueDto>> variantValues = productVariantValues.stream()
    .map(p -> new VariantValueDto(...))
    .collect(
        Collectors.collectingAndThen(
            Collectors.groupingBy(
                VariantValueDto::getProductVariantId,
                Collectors.toUnmodifiableList()
            ),
            Collections::unmodifiableMap
         )
    );


以上是如何从java中的Collectors.groupingBy返回不可修改的地图?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>