【问题标题】:Is there a better way to map over map values with Java streams? [closed]有没有更好的方法用 Java 流映射映射值? [关闭]
【发布时间】:2018-06-18 10:54:41
【问题描述】:

本质上是一种更好的写作方式:

Map<String, String> originalMap = getMapOfValues();
Map<String, String> newMap = originalMap.entrySet()
    .stream()
    .map(entry ->
        Maps.immutableEntry(entry.getKey(), mapValue(entry.getValue()))
    ).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue);

Maps.immutableEntry 是来自 Guava 的方法)

【问题讨论】:

  • 这个有什么问题?你对“更好”的衡量标准是什么?
  • 你目前的做法有什么问题......或者它看起来不是最理想的?
  • 更简单,因为似乎应该有更简单的方法来做到这一点,比如stackoverflow.com/a/50907929/152873

标签: java collections guava


【解决方案1】:

为什么需要将条目映射到Maps.immutableEntry()?你可以跳过这一步:

Map<String, String> originalMap = getMapOfValues();
Map<String, String> newMap = 
    originalMap.entrySet()
               .stream()
               .collect(Collectors.toMap(Map.Entry::getKey,
                                         entry -> mapValue(entry.getValue())));

【讨论】:

  • 如果Maps.immutableEntry 是对不可变映射的关键调用,那么这个版本可能会产生一个可变映射...
  • @ErnestKiwele OP 的原始代码将产生与我的完全相同的MapMaps.immutableEntry() 生成的条目的不变性不会在 collect(Collectors.toMap()) 步骤中存活。
  • @ErnestKiwele 这个immutableEntry 完全是多余的,OP 正在做.toMap(Map.Entry::getKey, Map.Entry::getValue)
【解决方案2】:

不使用 Streams,您可以执行以下操作:

Map<String, String> originalMap = getMapOfValues();
Map<String, String> newMap = new HashMap<>(originalMap);
newMap.replaceAll((key, value) -> mapValue(value));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    • 2011-02-02
    • 2016-01-23
    相关资源
    最近更新 更多