Java 8 集合最大大小和计数

Sur*_*say 4 java-8 java-stream

我有一个像下面这样的课程。

class Student {
    public Student(Set<String> seminars) {
        this.seminar = seminars;
    }
    Set<String> seminar;
    public Set<String> getSeminar()
    {
        return seminar;
    }
}
Run Code Online (Sandbox Code Playgroud)

并创建了一组如下所示的学生。

List<Student> students = new ArrayList<Student>();
Set<String> seminars = new HashSet<String>();

seminars.add("SeminarA");
seminars.add("SeminarB");
seminars.add("SeminarC");

students.add(new Student(seminars)); //Student 1 - 3 seminars
students.add(new Student(seminars)); //Student 2 - 3 seminars

seminars = new HashSet<String>();
seminars.add("SeminarA");
seminars.add("SeminarB");

students.add(new Student(seminars)); //Student 3 - 2 seminars

seminars = new HashSet<String>();
students.add(new Student(seminars)); //Student 4 - 0 seminars
Run Code Online (Sandbox Code Playgroud)

现在的问题是“我正在尝试获取参加过最多研讨会的学生人数”,正如您所看到的,有 2 名学生参加了 3 场(最多)研讨会,所以我需要获得该人数。

我使用流使用 2 个不同的语句实现了相同的效果

OptionalInt max = students.stream()
    .map(Student::getSeminar)
    .mapToInt(Set::size)
    .max();
long count = students.stream()
    .map(Student::getSeminar)
    .filter(size -> size.size() == max.getAsInt())
    .count();
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以使用一个语句来实现相同的效果?

Ale*_*amo 8

要解决此问题,请使用以下代码:

students.stream()
    .map(Student::getSeminar)
    .collect(Collectors.groupingBy(Set::size, Collectors.counting()));
Run Code Online (Sandbox Code Playgroud)

你的输出将是:

{0=1, 2=1, 3=2}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,two students研讨会的最大数量为三场。

首先,我们使用实际集合更改了流中的所有学生对象,然后使用 CollectorsgroupingBy()方法按大小对集合进行分组。

如果您只想获取学生人数,请使用以下代码:

students.stream()
    .map(Student::getSeminar)
    .collect(Collectors.groupingBy(Set::size, Collectors.counting()))
    .values().stream()
    .max(Comparator.comparing(a->a))
    .get();
Run Code Online (Sandbox Code Playgroud)

您的输出将是:2