Collectors.toMap выдает ошибку компиляции (String, List - PullRequest
0 голосов
/ 24 марта 2020
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class StreamExample {

    public static void main(String[] args) {

        Student student = new Student();
        StudentDB studentDb = new StudentDB();

        System.out.println("All Elements from the List \n");
        studentDb.getStudentList().forEach(System.out::println);

        Map<String, List<String>> studentMap = studentDb.getStudentList().stream()
                .collect(Collectors.toMap(student.getName(), student.getActivities()));

    }
}

Ответы [ 2 ]

2 голосов
/ 24 марта 2020

Дело в том, что вы используете student.getName(), который просто вызывает метод для объекта, поэтому вы получите его имя и его активацию, вы получите значения, а не метод generi c для завершения потока


Collectors.toMap ожидает, что вы передадите функции (Function<Student,String> для ключа, Function<Student,List<String>> для значения), которые из Student дадут что-то еще

  • Вы можете express это с лямбдой: s -> s.getName()

    Map<String, List<String>> studentMap = studentDb.getStudentList().stream()
                   .collect(Collectors.toMap(s -> s.getName(), s -> s.getActivities()));
    
  • Или ссылка на метод Student::getName, вы используете сам метод , не применяется к указанному c объекту

    Map<String, List<String>> studentMap = studentDb.getStudentList().stream()
                   .collect(Collectors.toMap(Student::getName, Student::getActivities));
    
2 голосов
/ 24 марта 2020

Метод toMap() ожидает Function<? super T, ? extends K> keyMapper и Function<? super T, ? extends U> valueMapper, которые отображают элементы вашего Stream на ключи и значения Map:

Map<String, List<String>> studentMap = 
    studentDb.getStudentList()
             .stream()
             .collect(Collectors.toMap(Student::getName, 
                                       Student::getActivities));

или

Map<String, List<String>> studentMap = 
    studentDb.getStudentList()
             .stream()
             .collect(Collectors.toMap(student -> student.getName(), 
                                       student -> student.getActivities()));
...