Java8 – Lambda表达式介绍 Lambda表达式,也可以称为闭包。Lambda允许把函数作为一个方法的参数传递进方法中使用。
Lambda表达式的使用前提是:接口中只能有一个方法,否则编译报错
Multiple non-overriding abstract methods found in interface
:在接口中找到多个非重写的抽象方法
完整的Lambda表达式由三部分组成:1. 参数列表 ; 2. 箭头(->
) ; 3. 声明语句 (+ 返回语句)
(Type param1, Type param2, ..., TypeN paramN) -> {
statment1;
statment2;
...;
return statmentN;
}
【Java基础|Java8 -- Lambda表达式】Lambda 表达式主要用来定义行内执行的方法类型接口,同时,Lambda 表达式免去了使用匿名方法的麻烦,并且给予Java简单但是强大的函数化的编程能力。
1. Lambda表达式的特征
2. 简单案例
- 可选类型声明 :可以不声明参数类型,编译器能够统一识别。
(param1, param2, ..., paramN) ->
- 单参数可省略参数的圆括号 :一个参数无需圆括号,但多个参数需要使用圆括号。
param1 ->
- **
{}
中只有一个语句可以省略大括号** :如果方法主体只有一个语句,就可以省略大括号,如果有多个语句,需要使用大括号。(param1, param2, ..., paramN) -> return statement1
- 如果
{}
中只有一个返回值,则可以省略返回关键字 :如果方法主体只有一个表达式返回值则编译器会自动确定返回值,但是大括号需要指明表达式返回一个数值。
public class LambdaStudy {/**
* 自定义接口IOperation
*/
interface IOperation {/**
* 返回两个数的操作(加减乘除等)
* @param x 参数1
* @param y 参数2
* @return 返回操作结果值
*/
int operation(int x, int y);
String getString(String str);
}/**
* 字符串操作接口
*/
interface StringOperation {/**
* 返回字符串
* @param str 参数
* @return 返回一个字符串
*/
String getString(String str);
}@Test
public void testLambda() {//使用类型声明(int)声明 加法 运算-- 可简写为 add = Integer::sum
IOperation add = (int x, int y) -> x + y;
//不使用类型声明 减法 运算
IOperation subtract = (x, y) -> x - y;
//有大括号声明 乘法 运算
IOperation multiply = (x, y) -> {
return x * y;
};
//不用括号声明 除法 运算
IOperation divide = (x, y) -> x / y;
System.out.println("6 + 6 = " + add.operation(6,6));
System.out.println("6 - 6 = " + subtract.operation(6,6));
System.out.println("6 * 6 = " + multiply.operation(6,6));
System.out.println("6 / 6 = " + divide.operation(6,6));
//字符串拼接输出
StringOperation strOperation = str -> "lambda -> " + str;
System.out.println(strOperation.getString("hello"));
}
}
运行结果:
6 + 6 = 123. Lambda表达式在实际应用中简洁化案例
6 - 6 = 0
6 * 6 = 36
6 / 6 = 1
lambda -> hello
例如:使用匿名内部类创建线程并运行
new Thread(new Runnable() {@Override
public void run() {System.out.println("Thread内部类方法run");
}
}).start();
使用lambda表达式来写只需要一行代码就鞥呢完成:
new Thread(() -> System.out.println("lambda方式创建线程")).start();
Lambda使用的是面向函数式编程的思想,一定程度上可以使代码看起来更加简洁。
4. 方法引用类型
Java8 Lambda表达式提供了集中类型的方法应用,主要是以下三种:
方法引用类型 | 描述 | 案例 |
---|---|---|
对象::实例方法 | 将 lambda 的参数当做方法的参数来使用 | objectName::instanceMethod |
类::静态方法 | 将 lambda 的参数当做方法的参数使用 | ClassName::staticMethod |
类::实例方法 | 将lambda的第一个参数当做方法的调用者,其他的参数作为方法的参数。(注意:开发中尽量少用这种写法,减少后续维护成本) | ClassName::instanceMethod |
5.1 无参构造方法
Supplier createUser1 = User::new;
//完整写法
Supplier createUser2 = () -> new User();
//通过get方法获取对象
User user = createUser1.get();
User user = createUser2.get();
5.2 有参构造方法
User类
@Data
class User {private String name;
private int age;
}
//一个参数,如果参数类型没有对应的构造方法则会编译出错:Cannot resolve constructor
Function, User> param1 = User::new;
//等价于 可以加括号的写法(name) -> 或者再加上对应的类型 (String name) ->
Function, User> param1_ = name -> new User(name);
User user = param1.apply("strive");
System.out.println(user);
运行结果:
User{name=‘strive’, age=0}
//两个参数的构造方法
BiFunction, Integer, User> param2 = (name, age) -> new User(name, age);
//等价于
BiFunction, Integer, User> param2_ = User::new;
User user = param2.apply("strive", 21);
System.out.println(user);
运行结果:
User{name=‘strive’, age=21}
推荐阅读
- Java并发编程 - 线程
- 程序员|薪水被应届生倒挂了,很不爽,我应该跳槽吗()
- 微信8.0安卓版来了
- Java面试题整理|历时两个月拿到阿里P7整个面试过程和offer(仅供参考)
- 大数据|《2021 年 Go 官方开发者调查报告》
- 活动专栏|新学期,新FLAG | 尽人事,听天命,守得云开见月明
- mybatis|[Spring实战] 整合Spring/SpringMVC/Mybatis(SSM)实现登录功能(带前端)
- java基础|java基础知识——(this,super关键字)
- JAVA笔记|Java——this关键字