我有一个字符串,需要将其转换为地图。字符串中有两个时间戳,因此这些值需要存储为时间戳,其他值需要存储为String。目前,我使用两个地图,然后将这些地图的值合并为一个新的地图,如下所示。我想知道是否有一种方法可以使用一张地图。
String paramsValues = reportGenerationSchedules.get(0).getReport_parameters();
paramsValues = paramsValues.substring(1,paramsValues.length()-1);
Map<String, Object> reportGenerationParams1 = Arrays.asList(paramsValues.split(",")).stream()
.filter(x -> x.toString().split("=")[0].contains("Date"))
.collect(Collectors.toMap(x -> x.toString().split("=")[0],
x -> Timestamp.valueOf(x.toString().split("=")[1])));
Map<String, Object> reportGenerationParams2 = Arrays.asList(paramsValues.split(",")).stream()
.collect(Collectors.toMap(x -> x.toString().split("=")[0],
x -> x.toString().split("=")[1]));
Map<String, Object> params = new HashMap<String,Object>();
params.putAll(reportGenerationParams2);
params.putAll(reportGenerationParams1);
答案 0 :(得分:2)
您可以定义如下函数:
Function<String, Object> function = str -> str.contains("Date") ?
Timestamp.valueOf(str.split("=")[1]) :
str.split("=")[1];
并使用此功能:
Map<String, Object> reportGenerationParams1 = Arrays.asList(paramsValues.split(","))
.stream()
.collect(Collectors.toMap(x -> x.split("=")[0],x -> function.apply(x)));
Arrays.stream(paramsValues.split(","))
.map(x -> x.split("=",2))
.collect(Collectors.toMap(ar -> ar[0],
ar -> ar[1].contains("Date") ?
Timestamp.valueOf(ar[1]) : ar[1]))