首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >方法引用适用于Comparator.comparing方法,而lambda表达式不起作用

方法引用适用于Comparator.comparing方法,而lambda表达式不起作用
EN

Stack Overflow用户
提问于 2021-02-18 16:28:01
回答 1查看 109关注 0票数 1

请任何人帮助我理解为什么下面的方法引用适用于thenComparing方法:

代码语言:javascript
运行
复制
List<Person> li = personList.stream()
                .sorted(Comparator.comparing(Person::getAge).thenComparing(Person::getName))
                .collect(Collectors.toList());

但是当我试图用lambda表达式来做它时,它不起作用。在这里,我收到一个编译错误--“无法在‘Object’中解析方法getAge‘”:

代码语言:javascript
运行
复制
List<Person> li = personList.stream()
                .sorted(Comparator.comparing(person -> person.getAge()).thenComparing(person -> person.getName()))
                .collect(Collectors.toList());

此外,我可以看到,如果删除thenComparing方法,则此代码再次适用于lambda表达式:

代码语言:javascript
运行
复制
List<Person> li = personList.stream()
                .sorted(Comparator.comparing(person -> person.getAge()))
                .collect(Collectors.toList());

你能告诉我我哪里出问题了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-18 16:36:54

问题在于这个表达式:

代码语言:javascript
运行
复制
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>上被调用。

请注意,如果显式指定参数的类型,则可以:

代码语言:javascript
运行
复制
Comparator.comparing((Person person) -> person.getAge()).thenComparing(person -> person.getName())
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66264038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档