使用流更改内部映射中的值

问题描述 投票:0回答:1

我有这样的地图Map,正如你所看到的,有一个内部地图“token”,在这个地图内部,有一个内部地图“tokeninfo”:

{
  "id": "44f79d20f28a2ea505b1",
  "type": "ONE",
  "cardIssued": "AA",
  "token": {
    "token1": "dummy",
    "tokenInfo": {
      "aaa": "007"
    },
    "payment": {
      "name": "test",
      "paymentType": {
        "card": "ONE"
      },
      "paymentAcc": "123"
    },
  "isDelegated": false,
  "attemptId": "981631"
}

另外,我还有这个方法:

private static HashMap<String, Object> getReplace(Map<String, Object> message) {
    HashMap<String, Object> message = new HashMap<>(message);

    for (String mapKey : PARAMETERS_FOR_REPLACE) {
        message.computeIfPresent(mapKey,
                (key, value) -> REGEX_ANY_CHAR.matcher(String.valueOf(value)).replaceAll("$^%%$"));
    }
    return message;
} 

我需要替换地图和内部地图中某些键的值。喜欢 : 已发行卡(从地图上看) token1(来自令牌的内部映射) aaa 来自 token -> tokeninfo 的内部映射 该值可以在任何内部映射中,而不仅仅是在 token 和 tokeninfo 上

有没有办法流式传输所有值以检查它是否是地图,然后调用该方法并替换它?

最终结果应该是:

    {
  "id": "44f79d20f28a2ea505b1",
  "type": "ONE",
  "cardIssued": "$^%%$",
  "token": {
    "token1": "$^%%$",
    "tokenInfo": {
      "aaa": "$^%%$"
    },
    "payment": {
      "name": "test",
      "paymentType": {
        "card": "ONE"
      },
      "paymentAcc": "123"
    },
  "isDelegated": false,
  "attemptId": "981631"
}

如果我运行这个:

  Map<String, Object> newMessage = getReplace(messageMap.entrySet().stream()
            .collect(Collectors.toMap(Map.Entry::getKey, entry -> (Object) entry.getValue())));

该值仅在“顶部”地图中发生变化。 有没有办法使用流并在所有内部和内部“内部”映射中执行它?

java stream maps
1个回答
0
投票

警告:我强烈建议您不要这样做

如果必须,您可以使用:

public class MapReplacer {
    public Map<String, Object> replace(Map<String, Object> input) {
        return input.entrySet().stream()
                .collect(Collectors.toMap(
                        Map.Entry::getKey,
                        (e) -> process(e.getKey(), e.getValue())
                ));
    }

    private Object process(String key, Object value) {
        return switch (value) {
            case String s -> processValue(key, s);
            case Map m -> replace(m);
            default -> throw new RuntimeException();
        };
    }

    private String processValue(String key, String s) {
        if (key.equals("key to replace")) {
            return "new value";
        } else {
            return s;
        }
    }
}

我建议您检查一下您的数据存储方法。

Map
中的
Object
不安全。建议您为数据结构使用自定义类。

© www.soinside.com 2019 - 2024. All rights reserved.