用Java分组项目

时间:2017-10-09 19:41:20

标签: 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 void main(String[] args) { 
    final int NO_OF_STUDENTS = 10000;
    Student[] students = createStudents(NO_OF_STUDENTS);
}

这里我有一个学生数组,其中包含许多Student对象,每个Student都有.getGrade()方法。

我尝试做类似的事情:

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

我知道学生数组本身没有.getGrade()方法,但它的元素却有。我想要的是,我可以将所有学生的成绩从students数组传递到Arrays.asList()方法,我不知道该怎么做。

4 个答案:

答案 0 :(得分:2)

为什么不使用map方法?

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

在这里,我将学生流映射到成绩流,然后对其进行分组。

我认为指出您不需要使用Arrays.asList就可以了。您可以使用Arrays.stream直接创建学生数组的流。

答案 1 :(得分:1)

就个人而言,我更喜欢使用传统的循环来生成地图。通过对Java 8中Map接口的改进,可以特别干净地完成。

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

答案 2 :(得分:0)

您正在寻找溪流mapToInt()方法:

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

您无法在IntStream上使用收集器。 - shmosel

然后让我们做一个“正常”的地图:

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

答案 3 :(得分:0)

可能

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

您的想法是首先创建Student的流,然后通过map每位学生创建另一个流级别。这将为您提供Stream<Integer>,您可以照常收集。

Link to docs