Lambda表达式

函数式编程思想概述

  • y = x + 1,在数学中,函数就是有输入量,输出量的一套计算方案;也就是“拿什么东西,做什么事情”。相对而言,面向对象过程过分强调"必须通过对象的形式来做事情",而函数式编程思想则尽量忽略面向对象的复杂语法—强调做什么,而不是以什么方式来做
  • 面向对象的思想:
  • 做一件事情,找一个能解决这个事情的对象,调用对象的方法来完成事情。
  • 函数式编程的思想:
  • 只要能获得这个事情的结果,谁去做的,怎么做的都不重要,重视的是结果,不重视过程。
    冗余的Runnable代码
    当需要启动一个线程去完成一项任务时,通常会通过Runnable接口来定义任务内容,并且使用Thread类来启动线程。
    代码如下:
 public static void main(String[] args) {       
        // 简化代码
		new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println(Thread.currentThread().getName() + "----->新线程被创建了!");
			}
		}).start();
 }   

传统的写法:

public class Demo01Runnable {
    public static void main(String[] args) {
        // 匿名内部类的方式
        new Thread(new Runnable() {
            @Override
            public void run(){
                System.out.println("开启了一个新的线程任务");
            }
        }).start();// 启动新线程  
    }
}

代码分析
对于Runnable的匿名内部类用法,可以分析出一下内容:

  • Thread类需要Runnable接口作为参数,其中抽象方法run用来指定线程任务内容的核心。
  • 为了指定run方法的方法体,不得不需要Runnable接口的实现类
  • 为了省去定义一个RunnableImpl实现类的麻烦,不得不使用匿名内部类。
  • 必须重写抽象方法run方法,所以方法的名称、方法的参数、方法的返回值不得不在写一遍,且不能写错。
  • 从这里面可以,只有方法体才是线程任务的关键性内容
    编程思想的转换
  • 做什么,而不是怎么做
  • 我们真正希望做的事情是:将run方法体内的代码传递给Thread类知晓能够加载到即可。
    传递一段代码—这是我们真正的目的。
  • 我们需要将程序关注的重点从***怎么做***回归到***做什么***的本质上,过程与形式并不重要。
  • 2014年3月Oracle官方所发布的Java 8(JDK1.8)中,加入了***Lambda表达式***
    在这里插入图片描述
体验Lambda表达式的更优写法
  • Java 8的新特性,优化刚才的代码
public class Demo01Runnable {
    public static void main(String[] args) {
        // 使用Lambda表达式的方式
        new Thread(() -> {
                System.out.println("开启了一个新的线程任务");
            }
        ).start();// 启动新线程  
    }
}
  • 从上面的代码可以看出:没有创建接口实现类对象的操作,也不再有抽象方法覆盖重写的操作,只写了线程任务的内容。
  • 从上面的代码能狗推导出Lambda的语法:
() -> System.out.println("开启了一个新的线程任务")
  • 前面的一对小括号即run方法,参数为无,里面是空的,此时需要任何的条件
  • 中间的一个箭头代表将前面的参数传递给后面的代码
  • 后面的输出语句即业务逻辑代码(线程任务内容)
    Lambda的标准格式
    格式由三个部分组成:
  • 一些参数
  • 一个箭头
  • 一段代码
    Lambda表达式的标准格式:
(参数类型1 参数名称1,参数类型2 参数名称2,....) -> {代码语句}

格式说明:

  • 小括号内的语法与传统的方法参数列表一致,无参数就留空,多个参数则用逗号隔开
  • ->是新引入的语法格式,代表指向的动作
  • 大括号内的语法与传统方法体要求基本一致。
Lambda省略格式
  • 可推导即可省略
  • Lambda强调的是“做什么”,而不是“怎么做”,所以凡是可以根据上下文推导得知的信息,都可以省略。比如:
invokeSum(3.14, 3.15, (double d1,double d2) -> {
			   return  d1 + d2;
		});
// 省略格式表达
invokeSum(3.14,3.15,(d1,d2) -> d1 + d2);

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

  1. 小括号内参数的类型可以省略。
  2. 如果小括号内有且仅有一个参数,则小括号也可以省略
  3. 如果大括号内有且仅有一个语句,则无论是否有返回值,都可以省略大括号、return关键字和语句的分号。
Lambda的使用前提

Lambda的语法非常的简洁,使用非常的简单,但是有以下注意事项:

  1. 使用Lambda必须具有接口,且要求接口中有且仅有一个抽象方法
    无论JDK内置的Runnable、Comparator接口还是自定义的接口,只有当接口中的抽象方法存在且唯一,才可以使用Lambda
  2. 使用Lambda必须具有***上下文推断***。
    也就是方法的参数或者局部变量类型必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例。
    备注:有且仅有一个抽象方法的接口,称为函数式接口
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值