我有一个代表依赖父级的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文件。
答案 0 :(得分:3)
您可以这样做:
Map<String, Set<String>> collect =
jsonData.stream().collect(Collectors.groupingBy(MyClass::getSubject_name, Collectors.mapping(MyClass::getPhrase_name, Collectors.toSet())));
您必须向getters
添加setters
和MyClass
才能使用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());