Loops 如何只迭代一次java流
我有一张数据Loops 如何只迭代一次java流,loops,java-8,stream,Loops,Java 8,Stream,我有一张数据地图,其中键是主题名称 我想迭代每个科目,并添加与学生对应的其他科目的分数 我试过follo wing: data.entrySet().stream().forEach(subject -> sumScoresOfAStudent(subject, data)); private void sumScoresOfAStudent(Entry<String, List<Student>> subject, Map<Str
地图
,其中键是主题名称
我想迭代每个科目,并添加与学生对应的其他科目的分数
我试过follo
wing:
data.entrySet().stream().forEach(subject -> sumScoresOfAStudent(subject, data));
private void sumScoresOfAStudent(Entry<String, List<Student>> subject, Map<String, List<Student>> data) {
String firstSubject = subject.getKey();
List<Student> firstSubjectScores = subject.getValue();
List<Student> otherSubjectScores = data.entrySet().stream()
.filter(subjectData -> !subjectData.getKey().equalsIgnoreCase(firstSubject))
.map(subjectData -> subjectData.getValue()).flatMap(subjectData -> subjectData.stream())
.collect(Collectors.toList());
...
}
对不起,我完全误解了你的意思。这假定学生类具有getters
getScore
和getName
。这只需将映射值
作为学生的列表
,然后将其展平为一个大流,并计算每个学生的分数总和
Map<String, Integer> scores = data.values().stream().flatMap(List::stream)
.collect(Collectors.groupingBy(Student::getName,
Collectors.summingInt(Student::getScore)));
scores.forEach((name,score) -> System.out.printf("Student %s - %s%n",
name,score));
你有一张列表地图,又称多重地图,似乎你想得到每个学生的总分。您可以使用
Map
进行此操作,键为学生姓名,值为总分
假设Student
有getName()
和getScore()
方法,这里有一种方法可以在没有流的情况下做你想做的事情:
Map<String, Integer> result = new LinkedHashMap<>();
data.forEach((k, students) ->
students.forEach(s -> result.merge(s.getName(), s.getScore(), Integer::sum)));
Map result=newlinkedhashmap();
数据。forEach((k,学生)->
students.forEach(s->result.merge(s.getName(),s.getScore(),Integer::sum));
这使用了,和。检查文档以了解它们是如何工作的
首先,我们正在迭代映射。然后,对于映射的每个条目(k,students)
,我们迭代这些值(这是一个学生列表)。对于列表中的每个元素student
,我们使用map.merge
方法将其名称和分数放入result
map
Map.merge
方法的工作原理与Map.put
相同,但是如果已经有一个具有相同键的条目,它会使用第三个参数(在本例中为Integer::sum
)将当前值与新值合并,这,将该键的新旧值相加。我认为如果您首先创建一张学生到其学科的地图,您的生活会更轻松:
Map<Student, List<String>> studentSubjects = new HashMap<>();
data.forEach((k, v) -> v.forEach(studentSubjects.computeIfAbsent(v, x -> new ArrayList<>()).add(k)));
Map studentSubjects=newhashmap();
data.forEach((k,v)->v.forEach(studentSubjects.computeifassent(v,x->newarraylist()).add(k));
但是你的“学生”班实际上并不代表一个学生,而是代表一个学生对某一科目的成绩。你也应该解决这个问题。那么对于
Map
来说,这门课程的关键是什么?学生名单是谁?比分在哪里?一个更具体的前一后的例子可能会有帮助(只是一个子集,而不是所有的数据);学生s21=新生(“B”,51);
Map<String, Integer> result = new LinkedHashMap<>();
data.forEach((k, students) ->
students.forEach(s -> result.merge(s.getName(), s.getScore(), Integer::sum)));
Map<Student, List<String>> studentSubjects = new HashMap<>();
data.forEach((k, v) -> v.forEach(studentSubjects.computeIfAbsent(v, x -> new ArrayList<>()).add(k)));