java学习笔记-lambda表达式
1.标准格式
形式参数+ 箭头+ 代码块
格式:{形式参数}->{代码块}
形式参数:如果有多个参数,参数之间用逗号隔开;如果没有参数,留空即可
-> 由英文中画线和大于符号组成,固定写法。代表指向动作
代码块:具体内容
lambda表达式使用前提:有一个接口,接口中有且仅有一个抽象方法
package com.ustc.test6;
public class TestLambda {
public static void main(String[] args) {
useShowHandler(new ShowHandler() {
@Override
public void show() {
System.out.println("我是匿名内部类的show方法");
}
});
//lambda表达式实现 没有参数 接口中只有一个方法
useShowHandler(()->{
System.out.println("我是lambda中的show方法");
});
}
public static void useShowHandler(ShowHandler showHandler){
showHandler.show();
}
}
interface ShowHandler{
void show();
}
2.无参数有返回值
package com.ustc.test7;
import java.util.Random;
public class RandomNumHandlerDemo {
public static void main(String[] args) {
useRandomHandler(new RandomNumHandler() {
@Override
public int getNumber() {
Random r = new Random();
int num = r.nextInt(10) + 1;
return num;
}
});
//lambda表达式 有返回值
useRandomHandler(()->{
Random r = new Random();
int num = r.nextInt(10) + 1;
return num;
});
}
public static void useRandomHandler(RandomNumHandler randomNumHandler)
{
int result = randomNumHandler.getNumber();
System.out.println(result);
}
}
interface RandomNumHandler{
int getNumber();
}
3.有参数有返回值
package com.ustc.test7;
public class Tes {
public static void main(String[] args) {
useCal(new cal() {
@Override
public int calc(int a, int b) {
return a + b;
}
});
useCal((int a,int b)->{
return a + b;});
}
public static void useCal(cal c){
int result = c.calc(1,2);
System.out.println(result);
}
}
interface cal{
int calc(int a,int b);
}
4.lambda表达式与匿名内部类之间的区别
1. 所需类型不同
匿名内部类:可以是接口 也可以是抽象类 还可以是具体类
lambda表达式:只能是接口
2. 使用限制不同
如果接口中有且仅有一个抽象方法 可以使用 lambda表达式 也可以使用 匿名内部类
如果接口中有多于一个抽象方法 只能使用匿名内部类 而不能使用lambda表达式
3. 实现原理不同
匿名内部类:编译之后产生一个单独的.class字节码文件
lambda表达式:编译之后 没有一个单独的.class字节码文件 对应的字节码文件 会在运行的时候 动态生成