java - 根据使用流的条件将值设置为 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("");
解决方案
用于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);
让我们分解一下:
第一步是
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
由于您希望最后找到的值与 中的键匹配
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
最后一步是从 created 中提取值
map
:String D1 = map.get(RapFilter.D1); String D2 = map.get(RapFilter.D2);
我没有测试过这个解决方案,它可能需要一些修改,包括重命名这个类Parameter
,因为我做了它。但是,我希望你能得到这个想法和一些你可以开始的东西。
请注意以下事项:
- 如果列表为空(不应发生),则将其
"UNKNOWN"
用作默认值。 map.get(RapFilter.D1);
null
如果密钥不存在,可能会返回。
推荐阅读
- python - VSCode 术语“pyinstaller”未被识别为 cmdlet、函数的名称
- java - 在 Java 中的可运行对象中调用可运行对象时会发生什么?
- azure - 将 asp.net 应用程序持续部署到 Azure 规模集
- google-tasks - 是否可以向 Google Tasks 添加一些元信息?
- sql - 查询每个客户的订单总数和发送订单数(如果没有则返回0)
- firebase - 如何对时间戳数据进行排序?
- java - Android Studio 按名称获取文件路径
- macos - 如何在 MacBook M1 上“在 Rosetta 2 下”安装 CLI 工具?
- highcharts - highcharts xaxis标签数据展示
- next.js - 如何自定义或屏蔽 nextjs 页面 url 地址?