【问题标题】:Collect stream of EntrySet to LinkedHashMap将 EntrySet 的流收集到 LinkedHashMap
【发布时间】:2019-03-29 05:43:33
【问题描述】:

我想将流收集到LinkedHashMap<String, Object>

我有一个存储在LinkedHashMap<String, Object> resources 中的JSON 资源。 然后我通过流式传输此地图的EntrySet 过滤掉JSON 元素。 目前我正在将流的元素收集到常规的HashMap。但在此之后,我将其他元素添加到地图中。我希望这些元素按插入顺序排列。

final List<String> keys = Arrays.asList("status", "createdDate");

Map<String, Object> result = resources.entrySet()
        .stream()
        .filter(e -> keys.contains(e.getKey()))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

result.put("date", "someDate");
return result;

这就是为什么我想将流收集到LinkedHashMap&lt;String, Object&gt;。我怎样才能做到这一点?

【问题讨论】:

  • 我有一个存储在 Map 资源中的 JSON 资源 -- 你怎么知道这张地图中的条目是按任何顺序排列的?除非它存储在 LinkedHashMap 中,否则您如何期望订单向前发展?
  • JSON 不关心 JSON 对象的键顺序。
  • 是的,但我愿意。我按特定顺序将它们打印出来,并通过将其与我的资源中的另一个 JSON 进行比较来对该方法进行单元测试。
  • @NicholasK 确实,我输入了错误的类型。应该是LinkedHashMap&lt;String, Object&gt; resources

标签: java hashmap java-stream linkedhashmap


【解决方案1】:

你可以用Stream做到这一点:

Map<String, Object> result = resources.entrySet()
            .stream()
            .filter(e -> keys.contains(e.getKey()))
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (x, y) -> y, LinkedHashMap::new));

(x, y) -&gt; y 部分是因为 mergeFunction 在查找重复键时返回找到的第二个键的值。第四部分是ma​​pFactory,供应商提供一个新的空地图,结果将插入其中。

【讨论】:

  • 如何在 scala 中做到这一点? :)
  • 当我们只想改变 hashmap impl 但保持重复行为时怎么办? JDK方便地将throwingMerger(以前的名称,当前jdk中不一定存在)保留为私有方法,并且4参数版本不允许指定累加器,只能映射合并...正确的方法是什么?
【解决方案2】:

使用Map.forEach 的另一种方法是:

Map<String, Object> result = new LinkedHashMap<>();
resources.forEach((key, value) -> {
    if (keys.contains(key)) {
        result.put(key, value);
    }
});
result.put("date", "someDate");

如果您可以考虑迭代 keySet 作为一个选项:

Map<String, Object> result = new LinkedHashMap<>();
resources.keySet().stream()
        .filter(keys::contains)
        .forEach(key -> result.put(key,resources.get(key)));
result.put("date", "someDate");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    相关资源
    最近更新 更多