使用lambda简化线程创建和比较器实现(实现函数式接口Runnable、Comparator)

参考①:JDK已有函数函数式接口介绍

Java 8 函数式接口 | 菜鸟教程 (runoob.com)

参考②:Java之线程池和Lambda表达式 - 我想回家 - 博客园 (cnblogs.com)

lambda体现的是一种函数式编程的思想, 它强调的是做什么,而不是以什么形式做。

使用前提

  • 使用Lambda必须具有接口,且要求接口中有且仅有一个抽象方法。无论是JDK内置的Runnable 、Comparator 接口还是自定义的接口,只有当接口中的抽象方法存在且唯一时,才可以使用Lambda。

  • 使用Lambda必须具有上下文推断。也就是方法的参数或局部变量类型必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例。

线程创建

使用Lambda简化前

实现Runnable接口的匿名内部类的实现:

public class Demo01Runnable {
    public static void main(String[] args) {
        // 匿名内部类
        Runnable task = new Runnable() {
            @Override
            public void run() { // 覆盖重写抽象方法
                System.out.println("多线程任务执行!");
            }
        };
        new Thread(task).start(); // 启动线程
    }
}

代码分析

  • Thread 类需要Runnable 接口作为参数,其中的抽象run 方法是用来指定线程任务内容的核心;

  • 为了指定run 的方法体,不得不需要Runnable 接口的实现类;

  • 为了省去定义一个RunnableImpl 实现类的麻烦,不得不使用匿名内部类;

  • 必须覆盖重写抽象run 方法,所以方法名称、方法参数、方法返回值不得不再写一遍,且不能写错;

  • 而实际上,似乎只有方法体才是关键所在。

使用Lambda简化后

public class Demo01Runnable {
    public static void main(String[] args) {
         new Thread(()->System.out.println("多线程任务执行!")).start(); // 启动线程
    }
}

集合排序比较器

// 创建数组
Integer[] arr = {1,8,3,4,9,2,5};
​
// 匿名内部类实现数组升序排序
Arrays.sort(arr,new Comparator<Integer>(){
​
    //使用Lambda简化前
    @Override
    public int compare(Integer o1, Integer o2) {
        return 0;
    }
});
​
//使用Lambda简化数组的升序排序
Arrays.sort(arr,( a, b)->{ return a - b ;});

Lambda表达式的省略规则

在Lambda标准格式的基础上,使用省略写法的规则为:

  1. 小括号内参数的类型可以省略;

  2. 如果小括号内有且仅有一个参,则小括号可以省略;

  3. 如果大括号内有且仅有一个语句,则无论是否有返回值,都可以省略大括号、return关键字及语句分号。

虽然有省略写法,但是我感觉这个有点灵活,所以不建议省略,因为代码是给别人看的,省略的话感觉别人看起来会有点费劲.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值