Java流API父子关系

时间:2017-08-17 06:48:59

标签: java java-stream

我有一个代表依赖父级的JSON文件 - >孩子(主题 - >短语)。我最初将JSON加载到MyClass的一个列表中

public class MyClass {

    String subject_name;
    String subject_color;
    Integer subject_weight;
    String phrase_name;
    Integer phrase_weight;      
}

所以最后我会Collection<MyClass>;

[
  {
    "subject_name": "ADMINISTRATION - Bureaucracy and Org Issues",
    "subject_color": "black",
    "subject_weight": 10,
    "phrase_name": "admin burden"
    "phrase_weight": 1
  },
  {
    "subject_name": "ADMINISTRATION - Bureaucracy and Org Issues",
    "subject_color": "red",
    "subject_weight": 10,
    "phrase_name": "user burden",
    "phrase_weight": 2
  },
  {
    "subject_name": "ADMINISTRATION - Bureaucracy and Org Issues",
    "subject_color": "blue",
    "subject_weight": 10,
    "phrase_name": "client burden",
    "phrase_weight": 3
  },
  {
    "subject_name": "ADMINISTRATION - Data Tools and Systems",
    "subject_color": "white",
    "subject_weight": 10,
    "phrase_name": "Computer level",
    "phrase_weight": 4
  },
  {
    "subject_name": "ADMINISTRATION - Data Tools and Systems",
    "subject_color": "black",
    "subject_weight": 10,
    "phrase_name": "Computer system",
    "phrase_weight": 10
  },
  {
    "subject_name": "ADMINISTRATION - Data Tools and Systems",
    "subject_color": "red",
    "subject_weight": 10,
    "phrase_name": "Computer tools",
    "phrase_weight": 2
  }    
]  

我有另一个分歧:

public Phrase {
    String phrase_name;
    Integer phrase_weight;  
}

public Subject {
    String subject_name;
    String subject_color;
    Integer subject_weight;
    Set<Phrase> phrases;
}

如何使用Java 8流最终从Collection集合中获取Subject对象。我能够只选择主题列表,但不知道如何处理短语子集。这是我的代码:

@Test
public void testUploadJSON() throws FileNotFoundException {

    String json = "C:\\ttt\\file.json";

    Gson gson = new Gson();
    BufferedReader br = new BufferedReader(new FileReader(json));
    Type type = new TypeToken<Collection<MyClass>>() {
    }.getType();
    Collection<MyClass> jsonData = gson.fromJson(br, type);

    Set<Subject> subjects = jsonData.stream().map(myClass -> {
        Subject subject = new Subject();
        subject.setName(myClass.getSubjectName());
        subject.setColor(myClass.getSubjectColor());
        subject.setWeight(myClass.getSubjectWeight());
        return subject;
    }).collect(Collectors.toSet());

    System.out.println(subjects.size());

    assertFalse(jsonData.isEmpty());
}

更新 我只是用主题和短语的更多属性更新输入JSON文件。

2 个答案:

答案 0 :(得分:3)

您可以这样做:

 Map<String, Set<String>> collect = 
 jsonData.stream().collect(Collectors.groupingBy(MyClass::getSubject_name, Collectors.mapping(MyClass::getPhrase_name, Collectors.toSet())));

您必须向getters添加settersMyClass才能使用method reference

答案 1 :(得分:0)

这是我的解决方案:

Set<Subject> subjects = jsonData.stream().collect(Collectors.groupingBy(Entity::getSubjectName))
        .entrySet().stream().map(

                entity -> {

                    Subject subject = new Subject();
                    subject.setName(entity.getKey());
                    subject.setCreatedBy(1L);

                    Set<Phrase> phrases = entity.getValue().stream().map(
                            p -> {

                                subject.setWeight(p.getSubjectWeight());
                                subject.setColor(p.getSubjectColor());
                                Phrase phrase = new Phrase();
                                phrase.setName(p.getPhraseName());
                                phrase.setWeight(p.getPhrasetWeight());
                                phrase.setColor(p.getPhrasetColor());
                                return phrase;
                            }

                ).collect(Collectors.toSet());

                    subject.setPhrases(phrases);

                    return subject;

                }).collect(Collectors.toSet());