• 念念不忘,必有回响!包含: Java 基础, Java 部分源码, JVM, Spring, Spring Boot, Spring Cloud, 开源项目等
  • 念念不忘,必有回响!包含: 数据库原理, MySQL, ElasticSearch, MongoDB, Docker,CI&CD, Linux, DevOps, 分布式, 中间件等
  • 念念不忘,必有回响!包含: 开发工具, Git, IDE, 源码阅读,读书笔记等

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());

全部评论