首页 > 解决方案 > 根据使用流的条件将值设置为 2 个字符串。将 for 循环转换为流

问题描述

我是 Java 流的新手。尝试根据 Java 流中的条件设置 2 个值。我试着做实验。可能是做错了什么。欢迎任何建议。

我要转换为流的工作代码是:

String D1 = "";
String D2 = "";

for(int i = 0; i < loadReportTableExt.getReportGenerationParameters().length; i++){
    if(loadReportTableExt.getReportGenerationParameters()[i].getKey().equalsIgnoreCase(RapFilter.D1)){
        D1 = loadReportTableExt.getReportGenerationParameters()[i].getValue();
    } else if(loadReportTableExt.getReportGenerationParameters()[i].getKey().equalsIgnoreCase(RapFilter.D2)){
        D2 = loadReportTableExt.getReportGenerationParameters()[i].getValue();
    }
}

我的尝试:

String D1  = Arrays.stream(loadReportTableExt.getReportGenerationParameters())
    .filter(rgp-> rgp.getKey().equalsIgnoreCase(RapFilter.D1))
    .findFirst()
    .map(rgp->rgp.getValue()) //not sure how to set D2
    .orElse("");

标签: javafilterjava-8java-stream

解决方案


用于Collectors.groupingBy按键对实体进行分组。让我们假设方法调用loadReportTableExt.getReportGenerationParameters()返回List<Parameter>对象(您应该清楚使用哪些对象)。

这是一个解决方案:

List<Parameter> parameters = loadReportTableExt.getReportGenerationParameters();
Map<String, String> map = Arrays.stream(parameters )
    .collect(Collectors.groupingBy(
            parameter -> parameter.getKey(), 
            Collectors.reducing("UNKNOWN", parameter -> parameter.getValue(), (s1, s2) -> s2)));

String D1 = map.get(RapFilter.D1);
String D2 = map.get(RapFilter.D2);

让我们分解一下:

  1. 第一步是Map<String, List<Parameter>>使用 key 创建地图Parameter.getKey()

    List<Parameter> parameters = loadReportTableExt.getReportGenerationParameters();
    Map<String, List<Parameter>> map = Arrays.stream(parameters)   // Stream<Parameter>
            .collect(Collectors.groupingBy(                        // Map<String, List<Parameter>>
                     parameter -> parameter.getKey()));            // .. with this key
    
  2. 由于您希望最后找到的值与 中的键匹配List<Parameter>,因此您可以使用另一个下游收集器将元素减少到最后一个元素中找到它Collectors.reducing

    List<Parameter> parameters = loadReportTableExt.getReportGenerationParameters();
    Map<String, String> map = Arrays.stream(parameters)            // Stream<Parameter>
            .collect(Collectors.groupingBy(                        // Map<String, String>
                    parameter -> parameter.getKey(),               // .. with this key
                    Collectors.reducing(                           // .. value from List<Parameter>
                            "UNKNOWN",                             // .... default value
                            parameter -> parameter.getValue(),     // .... real found value
                            (s1, s2) -> s2)));                     // .... the last one
    
  3. 最后一步是从 created 中提取值map

    String D1 = map.get(RapFilter.D1);
    String D2 = map.get(RapFilter.D2);
    

我没有测试过这个解决方案,它可能需要一些修改,包括重命名这个类Parameter,因为我做了它。但是,我希望你能得到这个想法和一些你可以开始的东西。

请注意以下事项:

  • 如果列表为空(不应发生),则将其"UNKNOWN"用作默认值。
  • map.get(RapFilter.D1);null如果密钥不存在,可能会返回。

推荐阅读