我有一个 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
}
]
我还有一个类(class):
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 文件。
最佳答案
你可以这样做:
Map<String, Set<String>> collect =
jsonData.stream().collect(Collectors.groupingBy(MyClass::getSubject_name, Collectors.mapping(MyClass::getPhrase_name, Collectors.toSet())));
您必须将 getters
和 setters
添加到您的 MyClass
才能使用 方法引用
关于Java 流 API 父子关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45728325/