首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8 JSON优化

Java 8 JSON优化
EN

Stack Overflow用户
提问于 2022-10-11 05:35:33
回答 2查看 63关注 0票数 -2

我有一个JSON的学生列表如下-对于每个学生,我想打印爱好,如果没有业余爱好显示NA使用Java 8。我已经写了下面的代码正在工作,但我必须使用2张地图。请建议是否可以优化此代码。

JSON

代码语言:javascript
复制
{
    "students":[
        {
            "fullName":"AAAAA",
            "standard":10,
            "hobbies":[
                "programming",
                "reading"
            ]
        },
        {
        }
    ]
}

JAVA 8

代码语言:javascript
复制
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")));
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-10-11 08:30:57

使用Java 8

您可以使用collectors.toMapjava 8获得所需的输出,如下面的代码所示:

这里,

  1. I使用了文本块(来自jdk15的特性)中的示例json,使json具有可读的格式。(您也可以使用简单的字符串格式),我使用了
  2. ,其中我们将密钥作为学生名称,并且我检查了兴趣爱好列表是否为空,并且不应该为空,然后执行连接学生所有业余爱好的下游操作,否则它将具有"NA“,而我使用了merger (a,b) -> a + "," + b,如果存在相同的名字,它将合并相同学生的爱好,TreeMap::new将按自然顺序对爱好进行排序。

代码:

代码语言:javascript
复制
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);
    }
}

输出::

代码语言:javascript
复制
{AAAAA=programming,reading, BBBB=music,reading, CCCC=NA}
票数 1
EN

Stack Overflow用户

发布于 2022-10-11 16:30:05

我觉得你应该分头去收集数据,然后把它整理好。

代码语言:javascript
复制
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));
}

以防万一,我们有以下课程

代码语言:javascript
复制
private static class Root {

    private List<Student> students;

}

private static class Student {

    private String fullName;
    private int standard;
    private Set<String> hobbies;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74023395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档