JAVA Lambda表达式
函数式
-
在数学中,函数就是有输入量,输出量的一套计算方案,也就是拿数据做操作
-
面向对象思想强调“必须通过对象形式来做事情”
-
函数式思想则尽量忽略面向对象的复杂语法:“强调做什么,而不是以什么形式去做”
-
Lambda表达式就是函数式思想的体现
Lambda表达式的标准格式
Lambda表达式的格式
-
格式:(形式参数) - > {代码块}
-
形式参数:如果有多个参数,参数之间用逗号隔开,如果没有参数,留空即可
-
->:又英文画线和大于符号组成,固定写法,表示指向动作
-
代码块,是我们具体要做的事,也就是以前我们写的方法体内容
Lambda表达式练习1(抽象方法无参无返回值)
Lambda表达式的使用前提
- 有一个接口
- 接口中有且有一个抽象方法
接口Eatable
public interface Eatable {
void eat();
}
接口Eatable的实现类
public class Eatablelmpl implements Eatable{
@Override
public void eat() {
System.out.println("吃午饭");
}
}
main操作类
public static void main(String[] args) {
//在主方法中调用方法
Eatable e = new Eatablelmpl();
useEatable(e);
//匿名内部类
useEatable(new Eatablelmpl(){
@Override
public void eat() {
System.out.println("一天一苹果");
}
});
//Lambda表达式
useEatable(()->{
System.out.println("今天吃苹果");
});
}
private static void useEatable(Eatable e){
e.eat();
}
}
Lambda表达式练习2(抽象方法带参无返回值)
Flyable接口
public interface Flyable {
void fly(String s);
}
main方法类
public static void main(String[] args) {
//匿名内部类
useFlyable(new Flyable() {
@Override
public void fly(String s) {
System.out.println(s);
System.out.println("nihao");
}
});
System.out.println("---------");
//Lambda表达式
useFlyable((String s)->{
System.out.println(s);
System.out.println("hello");
});
}
private static void useFlyable(Flyable f) {
f.fly("ooooo");
}
}
Lambda表达式练习3(抽象方法带参带返回值)
Addable接口
public interface Addable {
int add(int x,int y);
}
Addabledemo测试类
public static void main(String[] args) {
//匿名内部类
useAddable(new Addable() {
@Override
public int add(int x, int y) {
return x + y;
}
});
//Lambda表达式
useAddable((int x, int y) -> {
return x + y + x;
});
}
private static void useAddable(Addable a) {
int sum = a.add(1, 2);
System.out.println(sum);
}
}
Lambda表达式的省略模式
省略规则
- 参数类型可以省略,但是有多个参数类型的情况下,不能只省略一个
- 如果参数有且仅有一个,那么小括号可以省略
- 如果代码块的语句只有一句,可以省略大括号和分号,甚至是return
2个测试接口
public interface Addable {
int add(int x,int y);
}
public interface Flyable {
void fly(String s);
}
测试Demo
public static void main(String[] args) {
useAddable((int x, int y) -> {
return x + y;
});
//Lambda参数的类型可以省略
useAddable((x, y) -> {
return x + y;
});
//但是有多个参数的情况下不能只省略一个,要不不省略要不都省略
//同理以下也可以省略
useFlyable((String s) -> {
System.out.println(s);
});
useFlyable((s) -> {
System.out.println(s);
});
//如果参数有且只有一个,小括号也可以省略
useFlyable(s -> {
System.out.println(s);
});
//如果代码块的语句只有一条,可以省略大括号和分号
useFlyable(s -> System.out.println(s));
//如果只有一条语句且有return,也要省略掉return
useAddable((x, y) -> x + y);
}
private static void useFlyable(Flyable f) {
f.fly("你好");
}
private static void useAddable(Addable a) {
int sum = a.add(1, 2);
System.out.println(sum);
}
}
Lambda的注意事项
- 使用Lambda表达式,并且要有接口且仅有一个抽象方法
- 必须有上下文环境,才能推导出Lambda对应的接口
- 根据局部变量的赋值得知Lambda对应的接口:Runnable r = () -> System.out.println("hello");
- 根据调用自身方法的参数得知Lambda对应的接口:new Thread(() -> System.out.println("hello")).start();
public interface Inter {
void show();
}
public static void main(String[] args) {
// useShow(()->{
// System.out.println("你好");
// });
//使用Lambda表达式,并且要有接口且仅有一个抽象方法
useShow(() -> System.out.println("你好"));
//必须有上下文环境,才能推导出Lambda对应的接口
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("hello");
}
}).start();
//以Lambda表达式的方式如下
Runnable r = () -> System.out.println("hello");
new Thread(r).start();
//或者
new Thread(() -> System.out.println("hello")).start();
//Lambda 和 匿名内部类 都代表一个接口的匿名实现
}
private static void useShow(Inter i) {
i.show();
}
}