【问题标题】:How to remove innermap key using java 8 streams如何使用 java 8 流删除内部映射键
【发布时间】:2020-09-09 07:10:03
【问题描述】:

我正在尝试学习 Java Stream API,我有以下代码

List<HashMap<String, HashMap<String, String>>> map2 = new ArrayList<>();

HashMap<String, String> innerMap = new HashMap<>();
innerMap.put("a1", "hermione");
innerMap.put("a2", "harry");
innerMap.put("a3", "ron");

HashMap<String, HashMap<String, String>> outermap = new HashMap<>();
outermap.put("friends", innerMap);

List<HashMap<String, HashMap<String, String>>> list = new ArrayList<>();
list.add(outermap);

我想从内部地图中删除 harry,并且应该保留相同的结构 (List&lt;HashMap&lt;String, HashMap&lt;String, String&gt;&gt;&gt;),我如何使用 Streams API 来实现?

【问题讨论】:

  • Streams 不会修改底层对象,而是会根据您的操作为您提供一个新对象。
  • 附带说明,我建议您使用类来建模数据,而不是使用复杂的嵌套地图来表示朋友列表。遵循 OOP 是继续进行的理想方式,它将使您在编程方面的生活变得更好。

标签: java dictionary java-8 java-stream


【解决方案1】:

你真的需要在这里使用,只要你只想删除某个地图条目,同时保持整个结构:

list.forEach(map -> map.forEach(
    (key, value) -> value.entrySet()
        .removeIf(entry -> "harry".equals(entry.getValue()))));

如果您坚持使用 Stream API,只要 Stream API 适用于集合,请准备好处理条目和字典本身的复杂处理。看看:

List<Map<String, Map<String, String>>> newList = list.stream()
    .map(outer -> outer.entrySet().stream()
        .map(inner -> new SimpleEntry<>(
            inner.getKey(),
            inner.getValue().entrySet().stream()
                .filter(entry -> !"harry".equals(entry.getValue()))
                .collect(Collectors.toMap(Entry::getKey, Entry::getValue))))
        .collect(Collectors.toMap(Entry::getKey, Entry::getValue)))
    .collect(Collectors.toList());

此外,如前所述,类更适合表示这种复杂的数据结构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多