Java8_Lambda学习(1)——关于Comparator接口
前言(吐槽自己,正文在下):其实一开始只是简单看了看lambda,知道有,能写个hello world级别的例子而已。本着现在开始总比不看好的原则,学习一波。。 —————————————————————分割线———————————————————— 依旧菜鸟风格,Lambda详情等不作描述。 在习惯匿名类的用法后,直接看Lambda其实有点看不懂。
Collections.sort(a, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o1 - o2; } });
对于一开始就是接触匿名类的人来说,上面这个匿名类其实很明白的说明了传入的对象(Comparator),接口对象需要覆盖调用的方法,以及这个方法需要的参数和内部操作。
Collections.sort(a, (o1, o2) -> o2 - o1);
而这个Lambda的写法就有点抽象了,因为他都是编译器(不知道有没有说错)自己推断出的类型。 跳过Lambda。。。(发现自己说不明白) 说重点Comparator中的compare方法吧!!! 他是用于排序(不仅限于排序)的方法。 根据文档说明,返回值 INT有三种状态,负整数、零或正整数。 当我一开始重写这个方法的时候,想的和平时的比较一样,以为会返回一个我需要排序的对象。 于是变成了:
@Override public int compare(Integer o1, Integer o2) { return Math.max(o1, o2); }
很成功的没有对需要排序的对象作任何处理。 然后才去看了文档以及上网查。 发现并没有对这个方法的返回值状态对排序的结果作解释(可能是太简单 OR 我搜的不多)
Collections.sort(a, (o1, o2) -> o2 - o1); //[7, 6, 5, 4, 3, 1] Collections.sort(a, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o1 - o2; } }); //[1, 3, 4, 5, 6, 7]
再贴一遍代码。可以看到这两个的排序结果是不一样的。 给人一种直观的感受就是后一个参数放前面就是降序——o2-o1 而前一个参数放前面就是升序——o1-o2 但是我觉得不能这么理解有问题,很浅显。虽然我也不明白为什么决定浅显。
于是我把这两个参数o1,o2看成一个一维数组 当返回值为负整数时,选o1 当返回值为正整数时,选o2 零如果没有特意处理不做比较。
升序时,即o1 - o2 大于0 : o1大,大于零选o2嘛,小的o2在前面了。 小于0 : o2大,小于零选o1嘛,小的o1在前面了。 降序时,即o2 - o1 大于0 : o2大,选o2 小于0 : o1大,选o1
说的这么复杂好像没什么用。 其实直接点就是 前-后:升序 后-前:降序 零需要额外处理,即需要一个第二判断依据。 如
Collections.sort(a, new Comparator<Ds>() { @Override public int compare(Ds o1, Ds o2) { if (o1.i != o2.i) { return o1.i - o2.i; } else { return o1.s.compareTo(o2.s); } } });
正文完。
感谢观众看到最后 撒花~~~ 其实写的并不好,因为好像写点基本没有…… 诶。。。