You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 01:24:56