⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 blog.csdn.net/weixin_50635856 「石原里美的微笑」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

在写之前,我在考虑是否要写这篇文章,然而当我查阅“lambda表达式”的相关内容的时候,我发现大量的文章都出现了冗余的现象,文章的篇幅过于夸张,严重影响了大家阅读的兴趣,因此我决定写一篇关于lambda表达式的文章,让大家能够在一定程度上对lambda表达式有一定的理解。希望能够对你在Java的学习中起到一定的帮助。

Lambda概述

Lambda表达式是JDK8开始后的一种新语法形式

作用:简化匿名内部类的代码写法

格式:

(匿名内部类被重写方法的形参列表)->{
被重写方法的方法体代码
}
注:->是语法形式,无实际意义

首先我们先定义一个抽象类,通过匿名内部类重写其方法,再对其进行简化,比较二者之间有何变化:

使用Lambda表达式之前:

public static void main (String[] args){
People p = new People(){
@Override
public void run(){
System.out.println("小学生跑的很慢");
}
};
p.run();

}
abstract class People{
public abstract void run();
}

使用Lambda表达式之后:

People p = ()->{
System.out.println("小学生跑的很慢");
};
//会出现报错

会出现报错,这是为什么呢?原因在于前面对于Lambda表达式的定义并不清晰,Lambda表达式并不能简化所有匿名内部类,其只能简化函数式接口匿名内部类的写法形式,且接口中有且仅有一个抽象方法,通常,我们会再接口上加上一个@Functionalinterface注解,标记该接口必须是满足函数式接口。

真正意义上通过Lambda表达式简化:

@FunctionalInterface//加上这个注解必须是函数式接口,且只有一个抽象方法
interface People{
void run();
}
//简化之前的匿名内部类
People p = new People(){
@Override
public void run(){
System.out.println("小学生跑的很慢!");
}
};
//简化之后
People p = () -> {
System.out.println("小学生跑的很慢!");
};

另外,也可以将其作为参数代入方法中去使用:

//在原来的基础上定义一个pk方法
public static void pk(People p){
System.out.println("跑步情况如何:")
p.run();
}
//不使用Lambda的情况下:
pk(p);//需要在定义匿名内部类之后,将p代入;
//使用Lambda的情况:
People p = () -> {
System.out.println("小学生跑的很慢!");
};
pk(() -> {
System.out.println("小学生跑的很慢!");
});
//由于等号右边即是People创建的对象p,因此可以可以直接将其代入

Lambda的好处:

Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码,它可以写出更简洁、更灵活的代码,作为一种更紧凑的代码风格,使Java语言表达能力得到了提升。

Lambda实战的作用

在之前的学习过程中,我们学习过了Arrays的相关知识,其中有一个sort方法(可以将数组升序或降序排列),它其实也是接口类,并且只有一个抽象方法:

//精简之前:
Arrays.sort(grade,new Comparator<Integer>(){
@Override
public int compare(Integer o1,Integer o2){
return o2 -o1;
}
});
//精简之后:
Arrays.sort(grade,(Integer o1,Integer o2) -> {
return o2 -o1;
});

Lambda表达式省略规则

参数类型可以省略不写

//参考前面的实战例子
Arrays.sort(grade,(Integer o1,Integer o2) -> {
return o2 -o1;
});
//省略参数类型之后
Arrays.sort(grade,( o1, o2){
return o2 -o1;
});

如果只有一个参数,参数类型可以省略,同时()也可以省略

//简单引用一个单个参数的例子,不需要了解其具体含义
btn.addActionListener((ActionEvent e) -> {
System.out.println("我是简单的例子。");
});
//简化之后:
btn.addActionListener( e -> {
System.out.println("我是简单的例子。");
});

如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写,同时要省略分号

//参照上一条规则的例子
btn.addActionListener( e -> {
System.out.println("我是简单的例子。");
});
//简化之后:
btn.addActionListener( e -> System.out.println("我是简单的例子。") );

如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写。此时,如果这行代码是return语句,必须省略return不写,同时也必须省略";"不写

//参照第一条规则的代码
Arrays.sort(grade,(Integer o1,Integer o2) -> {
return o2 -o1;
});
//简化之后:
Arrays.sort(grade,( o1, o2)-> o2 -o1);

文章目录
  1. 1. Lambda概述
  2. 2. Lambda实战的作用
  3. 3. Lambda表达式省略规则