最近项目处理的数据比较复杂,对于嵌套多层且层数不明,key不明的map取值较难,写了一个工具类,递归获取Map中key指定的value。
功能:
1.替换指定key对应的value(替换单个)
2.替换指定key对应的value(替换所有)
3.获取嵌套map中key对应的value
代码如下:
import lombok.extern.slf4j.Slf4j;
import java.util.List;
import java.util.Map;
import java.util.Set;
@Slf4j
public class MapUtils {
/**
* 替换指定key对应的value(替换单个)
* @param map
* @param key
* @param value
* @return
*/
public static Object replace(Map<String,Object> map,String key,Object value){
Set<String> keys = map.keySet();
if(keys.contains(key)){
map.put(key,value);
return map;
}else{
for(String k:keys){
if(map.get(k) instanceof Map){
Map m = (Map) map.get(k);
replace(m,key,value);
}else if(map.get(k) instanceof List){
List m = (List) map.get(k);
for(Object l: m){
if(l instanceof Map){
replace((Map)l,key,value);
}
}
}
}
}
return map;
}
/**
* 替换指定key对应的value(替换所有)
* @param map
* @param key
* @param value
* @return
*/
public static Map replaceAll(Map<String,Object> map,String key,Object value){
Set<String> keys = map.keySet();
if(keys.contains(key)) {
map.put(key, value);
}else {
for(String k:keys){
if(map.get(k) instanceof Map){
Map m = (Map) map.get(k);
replaceAll(m,key,value);
}else if(map.get(k) instanceof List){
List m = (List) map.get(k);
for(Object l: m){
if(l instanceof Map){
replaceAll((Map)l,key,value);
}
}
}
}
}
return map;
}
//获取value
public static Object getValue(Map<String,Object> map,String key){
String tmpKey;
if(key.indexOf(".")==-1){
return map.get(key);
}else{
tmpKey=key.substring(0,key.indexOf("."));
}
Set<String> keys = map.keySet();
if(keys.contains(tmpKey)){
Map<String,Object> m = (Map<String,Object>) map.get(tmpKey);
return getValue(m,key.substring(key.indexOf(".")+1));
}else{
return null;
}
}
}
欢迎路过的大佬指正,期勉。
2021年10月24日 天气·晴