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)
有没有一种方法可以使用一个语句来实现相同的效果?
要解决此问题,请使用以下代码:
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。
| 归档时间: |
|
| 查看次数: |
7154 次 |
| 最近记录: |