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

如何将统计嵌套集合数量的Java代码转换为函数式风格?

转换为Java函数式风格的实现

没问题,我帮你把这段迭代式的代码改成更简洁的函数式风格写法,利用Java 8+的Stream API就能轻松搞定:

import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

// 函数式风格实现
Map<Country, Integer> modelsPerCountryMap = CountryDataSingleton.getCountryDataCollection()
    .stream()
    .collect(Collectors.toMap(
        // 直接用Country对象本身作为Map的key
        Function.identity(),
        // 计算每个Country对应的总Model数量
        country -> country.getListOfMakers()
            .stream()
            .mapToInt(maker -> maker.getModels().size())
            .sum()
    ));

代码细节解释:

  • 第一步把Country集合转为Stream,这是Java函数式操作的基础入口
  • 用Collectors.toMap()直接构建目标Map:
    • 第一个参数Function.identity()表示直接拿每个Country对象当key,不用额外转换
    • 第二个参数是核心的计算逻辑:先取出当前Country的所有CarMaker并转成Stream,再用mapToInt()把每个Maker转换成它的Model集合大小,最后通过sum()把所有Maker的Model数累加起来,得到该Country的总Model数

额外补充(处理极端情况):

如果你的单例集合里意外出现了重复的Country对象(虽然一般不会有),可以给toMap()加第三个参数处理key冲突,比如保留第一个出现的对象:

Collectors.toMap(
    Function.identity(),
    country -> country.getListOfMakers().stream().mapToInt(m -> m.getModels().size()).sum(),
    (existingValue, newValue) -> existingValue // 冲突时保留已有值
)

对比原来的迭代代码,函数式风格去掉了可变的count变量,代码更偏向声明式——你只需要描述“要得到什么结果”,不用关心“怎么一步步循环累加”,可读性和可维护性都提升不少。

内容的提问来源于stack exchange,提问作者Andoree

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:48:19