Java Stream API,从包含两个单独列表的列表中将结果收集到 Map<code, concatenated string>

问题描述 投票:0回答:1

这里是需要使用 Stream API 生成输出的代码,如下所示。

输入:

[Subgroup(id=1, names=[Name(languageCode=1, longName=ABD), Name(languageCode=2, longName=BD)], level=Level(names=[Names(languages=1, longName=1 1), Names(languages=2, longName=2 2)]))]

输出:

Map:{1=ABD~1 1, 2=BD~2 2}

Java-6:生成所需输出的代码。但是,我们需要使用 Stream API 并收集输出,因为示例输入仅提供单个 obj。我实时拥有超过 50 个对象。所以,我需要它在 Java 的高级版本中。

public class SubgroupProcessor {
    public static void main(String[] args) {
        List<Name> names = Arrays.asList(new Name(1, "ABD"), new Name(2, "BD"));
        List<Names> namesLevel = Arrays.asList(new Names(1, "1 1"), new Names(2, "2 2"));
        List<Subgroup> subgroups = Arrays.asList(new Subgroup(1, names, new Level(namesLevel)));
        System.out.println(subgroups);

        Map<Integer, String> map = new HashMap<>();
        for (Subgroup subgroup : subgroups) {
            List<Name> names2 = subgroup.getNames();
            List<Names> namesLevel2 = subgroup.getLevel().getNames();
            for (Name name : names2) {
                for (Names nameLevel : namesLevel2) {
                    if (nameLevel.getLanguages() == name.getLanguageCode()) {
                        map.put(name.getLanguageCode(), name.getLongName() + "~" + nameLevel.getLongName());
                    }
                }
            }
        }
        System.out.println("Map:"+map);
    }
}

@Data @AllArgsConstructor
class Subgroup {
    private int id;
    private List<Name> names;
    private Level level;
}

@Data @AllArgsConstructor
class Name {
    private int languageCode;
    private String longName;
}

@Data @AllArgsConstructor
class Names {
    private int languages;
    private String longName;
}

@Data @AllArgsConstructor
class Level {
    private List<Names> names;
}

也尝试过 Chat-GPT,但生成了以下代码,但它不起作用。

此代码使用 Java 8 流来处理输入列表,并以映射的形式生成所需的输出,其中语言代码作为键,串联名称作为值。

Map<Integer, String> map = subgroups.stream()
    .flatMap(subgroup -> subgroup.getNames().stream()
            .filter(name -> getMatching(subgroup, name))
            .map(name -> Map.entry(name.getLanguageCode(), name.getLongName() + "~" + getLevelLongName(subgroup, name)))
    )
    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
    

public static boolean getMatching(Subgroup sg, Name name) {
    return sg.getLevel().getNames().stream()
            .anyMatch(ln -> ln.getLanguages() == name.getLanguageCode());
}

private static String getLevelLongName(Subgroup subgroup, Name name) {
    return subgroup.getLevel().getNames().stream()
            .filter(levelName -> levelName.getLanguages() == name.getLanguageCode())
            .map(Names::getLongName)
            .findFirst()
            .orElse("");
}
java collections java-stream logic
1个回答
0
投票

你可以尝试这样的事情:

Map<Integer, String> result = subgroups.stream()
        .flatMap(subgroup -> 
            subgroup.getNames().stream()
                .map(name -> new AbstractMap.SimpleEntry<>(
                    name.getLanguageCode(), 
                    name.getLongName() + "~" + 
                        subgroup.getLevel().getNames().stream()
                            .filter(levelName -> levelName.getLanguages() == name.getLanguageCode())
                            .map(Names::getLongName)
                            .findFirst()
                            .orElse("")))
        )
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
© www.soinside.com 2019 - 2024. All rights reserved.