我知道在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()
方法,我不知道该怎么做。
答案 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>
,您可以照常收集。