Lambda 表达式
2023-04-15 11:12
2934
0
因为有接口中可以增加默认的方法实现,那么Java肯定是因为要简化开发才出现的这么个设计。所以你会从各个我们以前的List、Set等等所有接口中看到默认的方法实现。
从一段熟悉的排序列子入手
List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");
Collections.sort(names, new Comparator<String>() { @Override public int compare(String a, String b) { return b.compareTo(a); } });
@小傅哥: 代码已经复制到剪贴板
Collections 工具类提供了静态方法 sort 方法,入参是一个 List 集合,和一个 Comparator 比较器,以便对给定的 List 集合进行排序。上面的示例代码创建了一个匿名内部类作为入参,这种类似的操作在我们日常的工作中随处可见。
Java 8 中不再推荐这种写法,而是推荐使用 Lambda 表达:
Collections.sort(names, (String a, String b) -> { return b.compareTo(a); });
@小傅哥: 代码已经复制到剪贴板
上面的这段同样功能的代码块,简短干净了许多。就像婆媳一样可能刚开始看不习惯,但是接触接触就喜欢了。因为,它还可以更加简短优秀;
Collections.sort(names, (String a, String b) -> b.compareTo(a));
@小傅哥: 代码已经复制到剪贴板
为了追求极致,我们还可以让它再短点:{当然过你的实现不是一行代码,那么不能这么干}
names.sort((a, b) -> b.compareTo(a));
@小傅哥: 代码已经复制到剪贴板
java.util.List 集合现在已经添加了 sort 方法。而且 Java 编译器能够根据类型推断机制判断出参数类型,这样,你连入参的类型都可以省略啦,怎么样,是不是感觉很骚气呢!
java.util.List.sort
default void sort(Comparator<? super E> c) { Object[] a = this.toArray(); Arrays.sort(a, (Comparator) c); ListIterator<E> i = this.listIterator(); for (Object e : a) { i.next(); i.set((E) e); } }
@小傅哥: 代码已经复制到剪贴板
好了!你以为这就结束了吗,不!它还可以更短!(得益于Comparator接口中还提供了stack默认方法,也就是说接口中不是只可有default默认实现,还可以有静态方法)
names.sort(Comparator.reverseOrder());
全部评论