如何用Stream替代双重for循环生成指定格式的字符串?
问题描述
现有以下Java集合数据:
List<String> codes = new ArrayList<>(); List<String> year = new ArrayList<>(); Map<String, Map<String, String>> map1 = new HashMap<>(); Map<String, Map<String, String>> map2 = new HashMap<>(); codes = ["abc", "def"]; year = ["2000", "2001"]; map1 = {"abc": {"2000": "0", "2001": "1"}, "def": {"2000": "0.1", "2001": "0.3"}}; map2 = {"abc": {"2000": "0.1", "2001": "0.2"}, "def": {"2000": "7.8", "2001": "5.4"}};
需要生成按年份排序的指定格式字符串:
String s = "abc,2000,0,0.1, def,2000,0.1,7.8, abc,2001,1,0.2 def,2001,0.3,5.4";
此前使用双重for循环实现,但运行效率较低:
for (int i = 0; i < codes.size(); i++) { for (int j = 0; j < year.size(); j++) { String s = codes.get(i) + "," + year.get(j) + "," + map1.get(codes.get(i)).get(year.get(j)) + "," + map2.get(codes.get(i)).get(year.get(j)); } }
是否可以避免使用for循环,改用Stream来实现上述字符串拼接需求?
解决方案
可以通过Java Stream API实现,核心思路是先按年份排序,再按年份分组拼接对应代码的条目,最后组合成目标格式字符串。具体实现代码如下:
// 先对年份列表排序,确保输出按年份顺序排列 List<String> sortedYears = year.stream().sorted().collect(Collectors.toList()); // 生成目标字符串 String result = sortedYears.stream() // 处理单个年份:生成该年份下所有代码的条目,并用" "连接 .map(yearStr -> codes.stream() .map(code -> String.join(",", code, yearStr, map1.get(code).get(yearStr), map2.get(code).get(yearStr))) .collect(Collectors.joining(" "))) // 不同年份的结果用", "连接 .collect(Collectors.joining(", "));
代码说明
- 年份排序:先对
year列表做排序操作,保证输出结果严格按年份顺序排列。 - 条目拼接:针对每个年份,遍历所有代码,用
String.join拼接出单个条目(格式:code,year,map1值,map2值),同一年份下的条目用" "分隔。 - 结果组合:将不同年份的条目组用
", "连接,最终得到符合要求的字符串。
这种方式用Stream链式调用替代了双重循环,代码更简洁易读。Stream底层做了优化,在数据量较大时效率不会低于传统循环,甚至可能更优。
注意:如果
map1或map2中存在未包含的code或year,建议添加空值判断(比如使用Map.getOrDefault方法)避免空指针异常。
内容的提问来源于stack exchange,提问作者Awin
相关产品推荐
相关产品推荐

