过滤流并根据条件将值放入地图

时间:2019-07-03 04:50:48

标签: java-8 java-stream

我有一个字符串,需要将其转换为地图。字符串中有两个时间戳,因此这些值需要存储为时间戳,其他值需要存储为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);

1 个答案:

答案 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]))