Преобразовать список < Object > на карту < String, Integer > такой, что строка не является дублирующим значением с использованием потоков Java 8

. Одним из ключевых моментов промежуточного программного обеспечения .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) недостаточно. Вы можете узнать об этом здесь . Это очень хорошая статья.

6
задан Eran 20 January 2019 в 13:55
поделиться

3 ответа

Это из-за неправильной функции слияния, вместо этого вы должны использовать:

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
                ));
0
ответ дан Naman 20 January 2019 в 13:55
поделиться

Альтернативное решение заключается в использовании groupingBy с summingInt:

Map<String, Integer> studentMap = 
    studentList.stream()
               .collect(Collectors.groupingBy(s -> s.getStudentName().toLowerCase(),
                                              Collectors.summingInt(Student::getMarks)));
0
ответ дан Eran 20 January 2019 в 13:55
поделиться

Ваша функция слияния неверна. Это может быть (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 для группировки их по имени, суммируя их оценки.

0
ответ дан Federico Peralta Schaffner 20 January 2019 в 13:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: