. Одним из ключевых моментов промежуточного программного обеспечения .Net Core является то, что вы можете выполнить «короткое замыкание» общего исполнения конвейера, поэтому каждое промежуточное программное обеспечение имеет возможность вызывать следующее промежуточное ПО (что-то вроде «сотрясения») это выполнение в RequestDelegate
) или вернуться. Вот почему вам нужно Func
, что-то вроде app.Use(next => async context => { })
, как указано в комментарии @PrabhatSinha.
Вот как это происходит:
app.Use(async (context, next) =>
{
// Do something before next middleware
if (someDecision) // decision if we will run next
{
await next.Invoke(); // next middleware
// Do something after next middleware
}
});
Просто используя Use(RequestDelegate delegateVariableName)
недостаточно. Вы можете узнать об этом здесь . Это очень хорошая статья.
Это из-за неправильной функции слияния, вместо этого вы должны использовать:
Map<String, Integer> map = studentList.stream()
.collect(Collectors.toMap(
student->student.getStudentName().toLowerCase(),
Student::getMarks,
(s1,s2) -> s1 +s2, // add values when merging
LinkedHashMap::new
));
Альтернативное решение заключается в использовании groupingBy
с summingInt
:
Map<String, Integer> studentMap =
studentList.stream()
.collect(Collectors.groupingBy(s -> s.getStudentName().toLowerCase(),
Collectors.summingInt(Student::getMarks)));
Ваша функция слияния неверна. Это может быть (s1, s2) -> s1 + s2
или просто Integer::sum
, если вы предпочитаете использовать ссылку на метод.
Еще один способ сделать это без потоков:
Map<String, Integer> studentMap = new LinkedHashMap<>();
studentList.forEach(s -> studentMap.merge(
s.getStudentName().toLowerCase(),
s.getMarks(),
Integer::sum));
Это итерирует список студентов и использует метод Map.merge
для группировки их по имени, суммируя их оценки.