我有一个JSON的学生列表如下-对于每个学生,我想打印爱好,如果没有业余爱好显示NA使用Java 8。我已经写了下面的代码正在工作,但我必须使用2张地图。请建议是否可以优化此代码。
JSON
{
"students":[
{
"fullName":"AAAAA",
"standard":10,
"hobbies":[
"programming",
"reading"
]
},
{
}
]
}
JAVA 8
Map<String, List<Student>> studentMap = reportCard.getStudents().stream().collect(Collectors.groupingBy(Student::getFullName));
Map<String, String> studentMap2 = new TreeMap<>();
studentMap.keySet().forEach(key -> Optional.ofNullable(studentMap.get(key).get(0).getHobbies())
.ifPresentOrElse(hobbies -> studentMap2.put(key, hobbies.stream().map(String::trim).collect(Collectors.joining(";"))), () -> studentMap2.put(key, "NA")));
发布于 2022-10-11 00:30:57
使用Java 8
您可以使用collectors.toMap
从java 8获得所需的输出,如下面的代码所示:
这里,
(a,b) -> a + "," + b
,如果存在相同的名字,它将合并相同学生的爱好,TreeMap::new
将按自然顺序对爱好进行排序。代码:
public class Test {
public static void main(String[] args) throws JsonProcessingException {
String input = """
{
"students": [
{
"fullName": "AAAAA",
"standard": 10,
"hobbies": [
"programming",
"reading"
]
},
{
"fullName": "BBBB",
"standard": 12,
"hobbies": [
"music",
"reading"
]
},
{
"fullName": "CCCC",
"standard": 12,
"hobbies": [
]
},
{
}
]
}
""";
ObjectMapper mapper = new ObjectMapper();
StudentData data = mapper.readValue(input,StudentData.class);
Map<String,String> output =
data.getStudentList().stream().filter(a -> a.getName()!=null)
.collect(Collectors.toMap(Student::getName,
x -> (x.getHobbies()!=null && !x.getHobbies().isEmpty() ? String.join(",",x.getHobbies()) : "NA")
,(a,b) -> a + "," + b,TreeMap::new));
System.out.println(output);
}
}
输出::
{AAAAA=programming,reading, BBBB=music,reading, CCCC=NA}
发布于 2022-10-11 08:30:05
我觉得你应该分头去收集数据,然后把它整理好。
public static void main(String... args) {
Root root = new Root();
Map<String, Set<String>> studentHobbies = getStudentHobbies(root);
printStudentHobbies(studentHobbies);
}
private static Map<String, Set<String>> getStudentHobbies(Root root) {
return Optional.ofNullable(root.getStudents()).orElse(List.of()).stream()
.collect(Collectors.toMap(Student::getFullName,
student -> Optional.ofNullable(student.getHobbies())
.orElse(Set.of())));
}
private static void printStudentHobbies(Map<String, Set<String>> studentHobbies) {
studentHobbies.forEach((fullName, hobbies) ->
System.out.format("%s - %s\n",
fullName,
hobbies.isEmpty() ? "NA" : hobbies));
}
以防万一,我们有以下课程
private static class Root {
private List<Student> students;
}
private static class Student {
private String fullName;
private int standard;
private Set<String> hobbies;
}
https://stackoverflow.com/questions/74023395
复制