Java 8 过滤流并根据条件将值放入映射

Java 8 过滤流并根据条件将值放入映射,java-8,java-stream,Java 8,Java Stream,我有一个字符串,我需要将其转换为地图。字符串中有两个时间戳,因此这些值需要存储为时间戳,其他值需要存储为字符串。目前,我使用两个贴图,然后将这些贴图的值组合成一个新的贴图,如下所示。我想知道是否有一种方法可以使用一张地图 String paramsValues = reportGenerationSchedules.get(0).getReport_parameters(); paramsValues = paramsValues.substring(1,paramsVa

我有一个字符串,我需要将其转换为地图。字符串中有两个时间戳,因此这些值需要存储为时间戳,其他值需要存储为字符串。目前,我使用两个贴图,然后将这些贴图的值组合成一个新的贴图,如下所示。我想知道是否有一种方法可以使用一张地图

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);
String paramsValues=reportGenerationSchedules.get(0).getReport_parameters();
paramsValues=paramsValues.substring(1,paramsValues.length()-1);
Map reportGenerationParams1=Arrays.asList(paramsValues.split(“,”).stream()
.filter(x->x.toString().split(“=”[0]。包含(“日期”))
.collect(Collectors.toMap(x->x.toString().split(“=”)[0],
x->Timestamp.valueOf(x.toString().split(“=”[1]));
Map reportGenerationParams2=Arrays.asList(paramsValues.split(“,”).stream()
.collect(Collectors.toMap(x->x.toString().split(“=”)[0],
x->x.toString().split(“=”[1]);
Map params=新的HashMap();
参数putAll(reportGenerationParams2);
参数putAll(reportGenerationParams1);

您可以定义如下函数:

 Function<String, Object> function = str -> str.contains("Date") ? 
                               Timestamp.valueOf(str.split("=")[1]) : 
                                str.split("=")[1];

你能给我们看一些参数值的样本数据吗?startDate=2019-02-02 00:00:00.0,Name=20190702-all-active-subs-env-aa597d5d-494a-41dd-84e9-729331ae1c4b,partnerExternalId=SamplePartner_Test2,endDate=2019-03-02 00:00.0这是一个样本你的两张地图在逻辑上不一样。一个将字符串键映射到
时间戳
值,另一个仅将字符串映射到其他字符串。我不确定把这两张地图放在一张地图上是否有意义。也许只是把它们分开。我需要一张地图,因为这张地图将在其他地方使用。我使用两个映射,因为当我将两者结合起来时,后者将用时间戳值覆盖具有字符串值的键,这样字符串和时间戳值都将包含在同一个映射中。然后,您的数据模型似乎出现了一些问题。如果您想要作为单个映射,那么您可能会被
map
卡住。指定
x->function.apply(x)
而不仅仅是
function
有什么意义?或者为什么不在需要的地方指定实际的函数,而不是声明那个多余的变量呢?您可以使用
Arrays.stream(paramsValues.split(“,”)
而不是绕行
列表。相反,在两个函数中重复
x.split(“=”
),而不是在前面的
map
步骤中重复一次,是一种不鼓励的简化方法。@Holger,谢谢你的评论。我想也许它更具可读性,这就是为什么我声明了一个变量。x-function.apply(x)是我的错。老实说,我想到了“Arrays.stream()”,而且您不需要重复“x.split()”也是对的。
 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]))