Java 8 下非常弱的类型推断导致Comapring chain出现问题

Ivar_PredixCN 2017-09-07 10:16:59
加精
首先, 请看一段代码:

Collections.sort(playlist,
Comparator.comparing(s -> s.getTitle())
.thenComparing(p1 -> p1.getDuration())
.thenComparing(p1 -> p1.getArtist())
);


意图很简单, 给一个list按照三个不同的属性排序, 但是能编译通过吗?
答案是: 不能, 会出现编译错误.
JVM会抱怨不知道s是什么类型, p1是什么类型.

出现这个错误的原因, 是Java语言在类型推断上还是非常弱导致的, 你以为写第一个lambda( s->s.getTitle())时, java会知道遍历的对象是playlist里面的元素的类型, 但其实不是, 它并不知道

有三种方法来解决这个问题:

1. 用Java8的静态lambda表达式:

Collections.sort(playlist,
Comparator.comparing(Song::getTitle)
.thenComparing(Song::getDuration)
.thenComparing(Song::getArtist)
);


2. 用临时变量显式调用

Comparator<Song> byName = (s1, s2) -> s1.getArtist().compareTo(s2.getArtist());
Comparator<Song> byDuration = (s1, s2) -> Integer.compare(s1.getDuration(), s2.getDuration());
Collections.sort(playlist,
byName
.thenComparing(byDuration)
);


3. 在comparing chain开始的时候加入泛型参数的显式声明

Collections.sort(playlist,
Comparator.<Song, String>comparing((s) -> s.getTitle())
.thenComparing(p1 -> p1.getDuration())
.thenComparing(p1 -> p1.getArtist())
);


参考资料:
Very confused by Java 8 Comparator type inference
...全文
4288 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ivar_PredixCN 2017-10-23
  • 打赏
  • 举报
回复
引用 24 楼 why2010ps 的回复:
现在8用的多嘛?
我们已经很早就用上了.
劃止劇号 2017-10-20
  • 打赏
  • 举报
回复
非常好. 谢谢分享.
zgp1269 2017-10-14
  • 打赏
  • 举报
回复
谢谢啊 非常好的说
qq_40620353 2017-10-13
  • 打赏
  • 举报
回复
谢谢啊 非常好的说
killxj2shit 2017-10-13
  • 打赏
  • 举报
回复
java8啊 6666666666
L.K吃猫的鱼 2017-10-12
  • 打赏
  • 举报
回复
666666
shanhuolinfeng 2017-10-07
  • 打赏
  • 举报
回复
受教了
a15156 2017-10-06
  • 打赏
  • 举报
回复
很好地内容,多谢楼主啊!学习了
zsgwsjj 2017-09-29
  • 打赏
  • 举报
回复
I GET IT!谢谢
csdn987q 2017-09-25
  • 打赏
  • 举报
回复
22222211111111111
冷月孤峰 2017-09-22
  • 打赏
  • 举报
回复
在这点上,还是.NET比较好啊
芥子风 2017-09-19
  • 打赏
  • 举报
回复
现在8用的多嘛?
bigbaldy 2017-09-18
  • 打赏
  • 举报
回复
好东西,学习了!!!感谢楼主分享!
tj_cyp 2017-09-11
  • 打赏
  • 举报
回复
发表论坛可以获得积分么?
hugh_z 2017-09-10
  • 打赏
  • 举报
回复
谢谢分享。非常好。
yuansiryuansir 2017-09-10
  • 打赏
  • 举报
回复
很好 谢谢。。。。。。。
G15659871598 2017-09-09
  • 打赏
  • 举报
回复
谢谢楼主分享,学习了
qq_40166828 2017-09-09
  • 打赏
  • 举报
回复
谢谢楼主的分享,学习了
xiaoyurain3 2017-09-08
  • 打赏
  • 举报
回复
学习了,现在在转jdk8,谢谢分享
ljheee 2017-09-08
  • 打赏
  • 举报
回复
很好地内容
加载更多回复(11)

163

社区成员

发帖
与我相关
我的任务
社区描述
GE的Predix平台整合云计算可扩展性、大数据管理和高级分析技术来助力新一代的数字化企业。结合GE自己作为全球工业界领导者的经验,Predix云平台为开发高级工业应用程序提供可连接性、安全和高性能。
云计算大数据 技术论坛(原bbs)
社区管理员
  • GE Predix工业互联网开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧