Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 如何只迭代一次java流_Loops_Java 8_Stream - Fatal编程技术网

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)));