I have a list of Student
objects. Each of them contains a map of subjects and points earned as Double
.
public class Student {
public int student_id;
public String name;
Map<String, Double> examPoints = new HashMap<String, Double>();
public Student(int student_id, String name) {
this.student_id = student_id;
this.name = name;
}
public void setExamPoints(String name, Double points){
examPoints.put(name, points);
}
}
I'm trying to calculate the average score of all the students in a specific subject using Java Streams.
main()
Student studentOne = new Student(1, "Ole");
studentOne.setExamPoints("Programmering", 20.0);
studentOne.setExamPoints("Math", 10.0);
studentOne.setExamPoints("Algdat", 25.5);
Student studentTwo = new Student(2, "Åge");
studentTwo.setExamPoints("Fysikk", 12.0);
studentTwo.setExamPoints("Math", 15.0);
studentTwo.setExamPoints("Algdat", 65.5);
Student studentThree = new Student(3, "Per");
studentThree.setExamPoints("Matte", 24.2);
studentThree.setExamPoints("Gym", 45.0);
studentThree.setExamPoints("Algdat", 29.3);
Student studentFour = new Student(4, "Svein");
studentFour.setExamPoints("Programmering", 90.0);
studentFour.setExamPoints("AdvJava", 99.0);
studentFour.setExamPoints("Science", 29.5);
ArrayList<Student> allStudents = new ArrayList<Student>();
allStudents.add(studentOne);
allStudents.add(studentTwo);
allStudents.add(studentThree);
allStudents.add(studentFour);
double algdatAverage = allStudents.stream()
.mapToDouble(s -> s.examPoints.get("Algdat"))
.average()
.getAsDouble();
double mathAverage = allStudents.stream()
.mapToDouble(s -> s.examPoints.get("Math"))
.average()
.getAsDouble();
I'm getting a NullPointerException
:
Exception in thread "main" java.lang.NullPointerException
at Main.lambda$main$0(Main.java:39)
at java.base/java.util.stream.ReferencePipeline$6$1.accept(ReferencePipeline.java:246)
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.DoublePipeline.collect(DoublePipeline.java:514)
at java.base/java.util.stream.DoublePipeline.average(DoublePipeline.java:467)
at Main.main(Main.java:39)
I'm using Java 11.