使用Java Stream API将列表数据转换为<语言编码:拼接字符串>映射
正确的Java Stream API实现方案
首先明确依赖的实体类结构(基于需求推导,若你的类结构有差异可对应调整):
class Name { private String langCode; private String longName; // 标准getter方法 public String getLangCode() { return langCode; } public String getLongName() { return longName; } } class Level { private List<Name> names; public List<Name> getNames() { return names; } } class Subgroup { private Name name; private Level level; public Name getName() { return name; } public Level getLevel() { return level; } }
原Java 6嵌套循环逻辑示例
List<Subgroup> subgroups = ...; Map<String, String> langToLongNameMap = new HashMap<>(); for (Subgroup subgroup : subgroups) { Name subgroupName = subgroup.getName(); String langCode = subgroupName.getLangCode(); String subgroupLongName = subgroupName.getLongName(); for (Name levelName : subgroup.getLevel().getNames()) { if (langCode.equals(levelName.getLangCode())) { String combined = subgroupLongName + " - " + levelName.getLongName(); langToLongNameMap.put(langCode, combined); } } }
正确的Stream API实现
List<Subgroup> subgroups = ...; Map<String, String> langToLongNameMap = subgroups.stream() // 将每个Subgroup转换为(语言编码,拼接名称)的键值对,过滤Level中无对应语言的情况 .flatMap(subgroup -> { Name subgroupName = subgroup.getName(); String targetLang = subgroupName.getLangCode(); String subgroupLongName = subgroupName.getLongName(); return subgroup.getLevel().getNames().stream() .filter(levelName -> targetLang.equals(levelName.getLangCode())) .map(levelName -> new AbstractMap.SimpleEntry<>(targetLang, subgroupLongName + " - " + levelName.getLongName())); }) // 收集为Map,处理重复语言编码的情况 .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, // 合并策略:若同一语言有多条结果,这里用新值覆盖旧值;如需拼接可改为 existing + ", " + replacement (existing, newVal) -> newVal ));
关键逻辑说明
- flatMap:将单个Subgroup展开为0或1条键值对(仅保留Level中与Subgroup同语言的Name条目),避免嵌套循环的层级结构。
- Collectors.toMap:
- 前两个参数分别指定键(语言编码)和值(拼接后的长名称)。
- 第三个参数是合并函数,处理同一语言编码对应多个值的场景,可根据业务需求调整(如拼接所有结果、保留第一个值等)。
内容的提问来源于stack exchange,提问作者Yash
相关产品推荐
相关产品推荐

