请任何人帮助我理解为什么下面的方法引用适用于thenComparing方法:
List<Person> li = personList.stream()
.sorted(Comparator.comparing(Person::getAge).thenComparing(Person::getName))
.collect(Collectors.toList());
但是当我试图用lambda表达式来做它时,它不起作用。在这里,我收到一个编译错误--“无法在‘Object’中解析方法getAge‘”:
List<Person> li = personList.stream()
.sorted(Comparator.comparing(person -> person.getAge()).thenComparing(person -> person.getName()))
.collect(Collectors.toList());
此外,我可以看到,如果删除thenComparing方法,则此代码再次适用于lambda表达式:
List<Person> li = personList.stream()
.sorted(Comparator.comparing(person -> person.getAge()))
.collect(Collectors.toList());
你能告诉我我哪里出问题了吗?
发布于 2021-02-18 16:36:54
问题在于这个表达式:
Comparator.comparing(person -> person.getAge()).thenComparing(person -> person.getName())
在第一部分Comparator.comparing(person -> person.getAge())
中,编译器无法将lambda参数的类型推断为Person
,因为表达式没有分配给帮助推断该信息的变量。
另一方面,当移除thenComparing()
部件时,编译器可以推断lambda参数的类型,因为比较器Comparator.comparing(person -> person.getAge())
是作为sorted()
方法的参数,该方法在Stream<Person>
上被调用。
请注意,如果显式指定参数的类型,则可以:
Comparator.comparing((Person person) -> person.getAge()).thenComparing(person -> person.getName())
https://stackoverflow.com/questions/66264038
复制相似问题