Java 流 API 父子关系

标签 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
  }    
]  

我还有一个类(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())));

您必须将 getterssetters 添加到您的 MyClass 才能使用 方法引用

关于Java 流 API 父子关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45728325/

相关文章:

java - 如何计算List中某个元素出现的次数

Java 8 List<List<String>> 对象中的分组和求和

Java 收集 `set` 的分组和映射,但如果所有值都是 `null` 则需要一个空集

java - 为什么 .filter 不从我的 Map<String,Object> 中删除空值

java - Eclipse - 将 .jar 添加到动态 Web 项目

java - 将 JAR 从 $HOME/jre/lib/ext 移动到 Gradle 时出现 JDBC 错误

Java 8 流聚合通用列表以映射

java - 是否有一种干净(且为空安全)的方法来乘以 Java 中的映射值?

java.lang.ClassNotFoundException : Didn't find class "android. View .View$OnUnhandledKeyEventListener

java - 什么时候使用接口(interface)作为键类型对 HashMap 有意义?