对于Comparator.comparing(。。。)不太理解

来源:3-3 实战:利用Lambda+Stream处理业务逻辑

乃好

2020-04-01

老师您好,不太理解下面这块的排序写法

http://img.mukewang.com/szimg/5e84ad1f097aef5808960163.jpg

可以详细说说吗?

写回答

3回答

张小喜

2020-04-06

//img.mukewang.com/szimg/5e8b465f097786c513680286.jpg

咱们看看是如何从这种方式进行演化的啊。

这是你熟悉的方式,它的底层是调用list.sort方法的。可以看看源码:

//img.mukewang.com/szimg/5e8b46c50966f6f416040532.jpg

所以就能改写成上面这样list.sort()的方式。

我们再来看看Comparator的静态方法comparing是什么:

//img.mukewang.com/szimg/5e8b472309f4436f16540264.jpg

它其实就是使用lambda表达式定义了一个Comparator的函数式接口,并且提供了一个function的参数负责从c1和c2中获取相应的属性。

所以最后可以改写成这样:

//img.mukewang.com/szimg/5e8b47e7093112de11680110.jpg

就是告诉list,我想使用Sku对象的skuId属性进行排序。


其实这种声明式的编程方式将底层实现细节屏蔽了很多,比如说你使用SELECT * FROM USER的时候,根本不用关心它底层是如何对数据进行检索的。类似的Stream也是这样,我们直接调用它sort方法,给它一个需要排序的字段,它就帮我们排好序了。

2
1
乃好
哇谢谢老师,果然不懂的还是要先去看看源码
2020-04-06
共1条回复

张小喜

2020-04-02

可以加我qq,咱们约个时间,给你说说这块

0
0

张小喜

2020-04-02

你是指双冒号这种写法吗,可以看看后面补充的方法引用精讲那节。

0
1
乃好
老师您好,我是不太理解Comparator.comparing这样的排序,还是对于这种 Collections.sort(list,(o1, o2) -> { return o1.getAge() - o2.getAge(); }); 形式比较理解。
2020-04-02
共1条回复

Java高效编程技巧实践 告别996

可以改变的编程效率

1451 学习 · 326 问题

查看课程