Java中的项目分组

Java中的项目分组,java,Java,我知道,在java中,我可以对以下项目进行分组: System.out.println(Arrays.asList(1,2,3,3,4,2,2).stream() .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))); 这将返回: {1=1,2=3,3=2,4=1} 但是,我有以下代码: public static

我知道,在java中,我可以对以下项目进行分组:

System.out.println(Arrays.asList(1,2,3,3,4,2,2).stream()
    .collect(Collectors.groupingBy(Function.identity(),
                                   Collectors.counting()))); 
这将返回:

{1=1,2=3,3=2,4=1}

但是,我有以下代码:

public static void main(String[] args) { 
    final int NO_OF_STUDENTS = 10000;
    Student[] students = createStudents(NO_OF_STUDENTS);
}
这里我有一个students数组,其中包含许多Student对象,每个Student都有.getGrade()方法

我试着做一些类似的事情:

System.out.println(Arrays.asList(students.getGrade()).stream()
    .collect(Collectors.groupingBy(Function.identity(),
                                   Collectors.counting()))); 

我知道students数组本身没有
.getGrade()
方法,但它的元素有。我想要的是,我可以将所有学生的分数从
学生
数组传递到
数组。asList()
方法,我不确定如何执行此操作。

您正在查找streams
mapToInt()
方法:

System.out.println(Arrays.asList(students).stream()
    .mapToInt(student -> student.getGrade())
    .collect(Collectors.groupingBy(Function.identity(),
                                   Collectors.counting()))); 

您不能在IntStream上使用收集器什莫塞尔

然后让我们做一个“法线”贴图:

大概

System.out.println(
  Arrays.asList(students)
  .stream()
  .map(s -> s.getGrade())
  .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
); 
?

其思想是首先创建一个学生流,然后通过将每个学生映射到他们的年级来创建另一个流。这将为您提供一个
,您可以像往常一样收集它

为什么不使用此方法

System.out.println(Arrays.stream(students)
        .map(Student::getGrade)
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())));
在这里,我将学生流映射到一个成绩流,然后对他们进行分组


我认为这是很好的指出,你不需要使用这个。您可以直接使用创建学生数组流。

我个人更喜欢使用传统的循环流来生成地图。通过对Java8中的
Map
接口的改进,可以非常干净地完成这项工作

Map<Integer, Integer> gradeCounts = new TreeMap<>();
for (Student student : students)
    gradeCounts.merge(student.getGrade(), 1, Integer::sum);
Map gradeCounts=new TreeMap();
用于(学生:学生)
gradeCounts.merge(student.getGrade(),1,Integer::sum);

领先我16秒;)包括API的验证;o) 不能在IntStream.Fair point@shmosel上使用收集器。Timothy,我觉得你在学生后面有一个括号太多了:)这会给你一个
IntStream
,你可以像往常一样收集它。不,你不能。您需要使用常规流。此外,您可以只使用
Arrays.stream()
。您还可以使用
Student::getGrade
作为映射函数。感谢您的第一个提示;更正。我仍然习惯于流API,并且对我能获得的任何经验都很满意。是的,我可以使用它,但我主要坚持问题中给出的代码。是的,我可以使用方法参考,但我还是坚持使用基于个人偏好的lambdas@shmosel谢谢你的输入!为什么要使用
.mapToInt(…).boxed()
当你可以只使用
.map()
时?为什么要使用
树形图呢?我几天前回答了这个问题,所以我不确定我的推理,但我想是等级有一个自然的顺序,所以使用有序的地图是有意义的。
Map<Integer, Integer> gradeCounts = new TreeMap<>();
for (Student student : students)
    gradeCounts.merge(student.getGrade(), 1, Integer::sum);