-
Lambda表达式在一定程度上可以简化匿名内部类的代码
-
lambda表达式与匿名内部类区别:匿名内部类可以实现或继承接口或类;Lambda表达式只能实现函数式接口
-
Lambda 允许把函数作为一个方法的参数
-
lambda 表达式只能引用标记了 final 的外层局部变量,这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误
-
lambda 表达式的局部变量可以不用声明为 final,隐性的具有 final 的语义
-
可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
-
可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
-
可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
-
可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值。
关于内部类中匿名内部类的内容可以看这:java中的内部类
看看lambda表达式是什么:
package com;
public class demo1 {
public static void main(String[] args) {
// 1. 匿名内部类形式
A a1 = new A() {
@Override
public void print(int n) {
System.out.println("值为" + n);
}
};
a1.print(1);
// 使用lambda表达式
A a2 = (int n) -> {System.out.println("值为" + n);};
a2.print(2);
// 省略lambda表达式部分内容
// 可以省略参数类型
// 只有一个参数,省略小括号
// 只有一条语句,省略大括号
A a3 = n -> System.out.println("值为" + n);
a2.print(3);
// 2. 匿名内部类形式 (有返回值的)
B b1 = new B() {
@Override
public int create() {
return 4;
}
};
System.out.println(b1.create());
// 使用lambda表达式
// 无参不能省略小括号
// 如果主体只有一个表达式返回值则编译器会自动返回值,省略return
B b2 = () -> 5;
System.out.println(b2.create());
}
}
// 定义一个接口(函数式接口)
interface A{
// 能实现lambda表达式的接口要求: 只能有一个需要被实现的方法(抽象方法),不是规定接口中只能有一个方法
// operator方法是A中唯一需要被实现的方法
void print(int n);
// 有这种default方法是没事的
default void operator1(int a, int b){
}
}
interface B{
int create();
}
关于default方法可以看这:java中的abstract和interface浅析_抽象__接口
一种用途:cal方法可以对2, 1两个数根据传入的操作方法参数进行计算
package com;
public class demo2 {
// 计算
public int cal(op operate){
return operate.operator(2, 1);
}
public static void main(String[] args) {
//加
op add = (a, b) -> a + b;
//减
op sub = (a, b) -> a - b;
//乘
op mul = (a, b) -> a * b;
//除
op div = (a, b) -> a / b;
demo2 d = new demo2();
int result = d.cal(add);
int result2 = d.cal(div);
System.out.println("add:" + result + "\ndiv:" + result2);
}
}
// 定义操作接口
interface op {
int operator(int a, int b);
}
/*
结果:
add:3
div:2
*/
在创建线程时可以使用lambda表达式
在使用spark大数据框架中也可以使用lambda表达式
等等
让Lambda表达式更加简洁——方法引用