Lambda表达式的基础用法
- 需要一个接口
- 接口中有且只有一个抽象方法
- 必须有上下文环境(赋值或者是对应参数)
无参无返回值
接口:
public interface Person {
void eat();
}
测试类:
public class LambdaDemo {
public static void main(String[] args) {
/*
* 三种方式实现接口:
*
* 1.新建一个实现类实现接口
* 2.匿名内部类实现接口
* 3.lambda表达式
* */
// 2.匿名内部类实现
useEat(new Person() {
@Override
public void eat() {
System.out.println("吃");
}
});
// 3.lambda表达式
/*
* 写法和js的ES6中的箭头函数类似
* 这次写的是无参方法
* */
useEat(() -> {
System.out.println("吃");
});
}
// 定义一个方法,参数为这个接口的多态对象
public static void useEat(Person person){
// 调用接口中的方法
person.eat();
}
}
带参无返回值
接口:
public interface Person {
void sing(String song);
}
测试类:
public class Lambda {
public static void main(String[] args) {
// 匿名内部类
useSing(new Person() {
@Override
public void sing(String song) {
System.out.println(song);
}
});
// lambda表达式
useSing((String s) -> {
System.out.println(s);
});
}
// 定义一个方法
public static void useSing(Person person){
person.sing("天下");
}
}
带参带返回值
接口:
public interface Math {
int add(int x,int y);
}
测试类:
public class Lambda {
public static void main(String[] args) {
// lambda表达式
UseAdd((int x,int y) -> {
return x + y ;
});
}
public static void UseAdd(Math m) {
System.out.println(m.add(1, 2));
}
}
lambda的省略
- 可以省略数据类型
- 如果只有一个参数,()可以省略
- 代码块只有一条{}可以省略
- 在3的基础上如果有return需要省略return
接口:
public interface Person {
String sing(String song1,String song2);
}
测试类:
public class Lambda {
public static void main(String[] args) {
// 使用lambda实现
// 1.可以省略数据类型,
// 但是多个参数时,只能全都省,或者全都不省
useSing((s1,s2) -> {
return new String(
new StringBuilder()
.append(s1)
.append(s2));
});
// 2.如果只有一个参数,()可以省略
// 3.代码块只有一条{}可以省略
// 4.在3的基础上如果有return需要省略return
// 上述代码可以改成
useSing((s1,s2) -> new String(new StringBuilder().append(s1).append(s2)));
}
// 定义一个方法
public static void useSing(Person person){
// 调用接口中的方法
String sing = person.sing("歌曲1","歌曲2");
System.out.println(sing);
}
}
lambda和匿名内部类实现原理的区别
- 匿名内部类相比lambda会额外产生.class文件
- lambda表达式的字节码文件是在运行时动态的生成