java - Java8中如何进行分组和缩减

标签 java arraylist lambda java-8 java-stream

因为我有主题的列表

"Subjects":[
{"subject":"Math","grades":1},
{"subject":"Math","grades":2},
{"subject":"Math","grades":3},
{"subject":"Math","grades":3},
{"subject":"Lab","grades":10},
{"subject":"Lab","grades":12}
]

我想像这样分组和减少结果

//Expected Result
"Subjects":[
{"subject":"Math","grades":[1,2,3]},
{"subject":"Lab","grades":[10,12]}
]

我很好奇如何以 java8 风格映射和减少对象。 我把过时的代码放在下面。

我的主课

public static void main(String[] args)  {
List<Subject> list = new ArrayList<>();
list.add(new Subject("Math",1));
list.add(new Subject("Math",2));
list.add(new Subject("Math",3));
list.add(new Subject("Math",3));
list.add(new Subject("Lab",10));
list.add(new Subject("Lab",12));        
Map<String, Set<Integer>> result = new HashMap<>();
list.stream().forEach(subjects-> {
    if(result.get(subjects.getSubject())==null){
        Set<Integer> set = new HashSet<>();
        set.add(subjects.getGrades());
        result.put(subjects.getSubject(),set );
    }else{
        Set<Integer> set =result.get(subjects.getSubject());
        set.add(subjects.getGrades());
        result.put(subjects.getSubject(), set);
    }
    });

    result.forEach((key,val)->{
        System.out.println("KEY:"+key + " RESULT :"+val);
    });

}  


public class Subject {
private String subject;
private Integer grades;

public Subject(String subject , Integer grade) {
this.subject = subject;
this.grades = grade;
}

/** get set **/
}

最佳答案

您可以使用Collectors.groupingBy(Subject::getSubject)和一个 Collectors.mapping(Subject::getGrades, Collectors.toSet())作为下游。

list.stream()
    .collect(Collectors.groupingBy(Subject::getSubject,
                 Collectors.mapping(Subject::getGrades, 
                     Collectors.toSet())));

它会给你一个 Map<String, Set<Integer>> .

{Lab=[10, 12], Math=[1, 2, 3]}

关于java - Java8中如何进行分组和缩减,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57708103/

相关文章:

vb.net - 如何抑制 VB 的 "Iteration variable shouldn' t 被用于 lambda 表达式"

c++ - 如何使用 typedef 声明 lambda 函数,然后通过传递给函数来使用它?

java - Documentum DFS : Timeout for service calls

java - 以自定义顺序根据其属性对对象的数组列表进行排序

java - Arraylist<String[]> 如何访问?

java - 自动将构造的每个 Class 对象添加到 ArrayList 中

haskell - 将列表应用于输入的函数以检查同义反复

java - 我应该将哪个版本的 Spring Security 与 spring core 3.2.5.RELEASE 一起使用

java - 在本地部署 App Engine 连接的 Android

java - 通过 osascript 将您的 java 应用程序提升为 MAC OSX 上的管理员权限