【问题标题】:Collectors.toMap gives compilation error (String,List<String) is not applicable for the argumentsCollectors.toMap 给出编译错误 (String,List<String) 不适用于参数
【发布时间】:2020-03-24 08:30:21
【问题描述】:
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()));

    }
}

【问题讨论】:

  • 您似乎想要Student::getNameStudent::getActivities 之类的东西。方法引用,而不是立即调用方法。
  • 地图> studentMap = studentDb.getStudentList().stream() .collect(Collectors.toMap(s -> s.getName(), s -> s.getActivities ()));它工作正常。但是如果我使用方法引用,我会得到编译时错误。地图> studentMap = studentDb.getStudentList().stream() .collect(Collectors.toMap(student::getName(), student::getActivities()));
  • @mmathank 小心,student::getNameStudent::getName(大写 S相同

标签: java java-stream type-inference


【解决方案1】:

一个东西,你正在使用student.getName(),它只是调用一个对象的方法,所以你会得到它的名字和它的活动,你会得到值,没有通用的方法来结束流


Collectors.toMap 期望您传递函数(Function&lt;Student,String&gt; 为键,Function&lt;Student,List&lt;String&gt;&gt; 为值),来自Student 的函数将提供其他内容

  • 你可以用 lambda 表达它:s -&gt; s.getName()

    Map<String, List<String>> studentMap = studentDb.getStudentList().stream()
                   .collect(Collectors.toMap(s -> s.getName(), s -> s.getActivities()));
    
  • 或者方法引用Student::getName,你使用的是方法本身,没有应用到具体的对象上

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

【讨论】:

  • @mmathank 确切地说,你可能不会对对象的方法进行特定调用,但通常是在方法本身,因为它将应用于 Stream 的所有对象
【解决方案2】:

toMap() 方法需要一个 Function&lt;? super T, ? extends K&gt; keyMapper 和一个 Function&lt;? super T, ? extends U&gt; 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()));

【讨论】:

  • @Lino OP 的 Student student = new Student(); 似乎是 OP 错误的一部分,所以我将其删除。 lambda 表达式参数的名称是一个问题。
猜你喜欢
  • 2012-04-19
  • 1970-01-01
  • 2022-12-12
  • 2015-11-20
  • 2013-08-20
  • 1970-01-01
  • 2021-08-26
  • 2020-08-26
  • 1970-01-01
相关资源
最近更新 更多