这里是需要使用 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("");
}
你可以尝试这样的事情:
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));