我有这样的地图Map
{
"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())));
该值仅在“顶部”地图中发生变化。 有没有办法使用流并在所有内部和内部“内部”映射中执行它?
警告:我强烈建议您不要这样做
如果必须,您可以使用:
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
不安全。建议您为数据结构使用自定义类。