javaSE
lambda相关
lambda表达式是jdk1.8以后提供的新的语法规则。
lambda表达式体现的是另外一种编程思想: 函数式编程思想
函数:在数学中函数表示的是有输入量,输出量的一种计算方案,强调的是做什么。
java语言是面向对象的语言,面向对象的语言关注点是对象,谁可以帮助我做事情。
lambda基本格式: () -> {}
(参数类型 参数名) -> {方法体}
lambda使用时,必须要有一个接口,且接口中只能有一个抽象方法(函数接口),必须要有上下文环境。
lambda基本格式:
(参数类型 参数名) -> {方法体}
参数类型和个数需要和需要实现的接口,保持一致
需要几个传几个,需要什么类型就传什么类型
//无参无返回值
public interface Inter1{
void eat();
}
public class Test1{
public static void main(String[] args){
toEat( () -> {
System.out.println("去吃火锅");
});
}
public static void toEat(Inter1 inter){
inter.eat();
}
}
lambda支持省略
1. 参数类型可以省略,但是有多个参数的情况下,不能只省略一个
2. 如果参数有且仅有一个,那么小括号可以省略
3. 如果代码块的语句只有一条,可以省略大括号,分号和return
//带参数有返回值
public interface Calculator {
int calc(int a,int b);
}
public class CalculatorDemo {
public static void main(String[] args) {
int cal = useCalculator( (a,b) ->
a + b
);
System.out.println(cal);
}
public static int useCalculator(Calculator c){
int calc = c.calc(25,68);
return calc;
}
}
lambda和匿名内部类的区别
使用前提:
- 匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
- Lambda表达式:只能是接口,接口中只能有一个抽象方法
运行原理:
- 匿名内部类:编译之后,产生一个单独的.class字节码文件
- Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成。
lambda和匿名内部类共同点是当一个方法需要传的参数类型为一个接口时,不需要单独去建一个实现类,节省空间
拓展—匿名内部类
匿名内部类是一种特殊的内部类,必须要先定义一个类或者接口,它的本质是实现某一个接口或者继承某一个类的子类对象,通常在一个方法需要传递父类对象或者接口类型的参数时,把匿名内部类作为方法的参数进行传递
定义格式:
new 类名/接口名() {
// 重写方法
};
public interface Inter {
public abstract void show() ;
}
new Inter() { // 本质上是一个实现了Inter这个接口的子类对象
public void show() {
System.out.println("Inter...show......") ;
}
};
public class Student {
public void show() {
System.out.println("Student...show......") ;
}
}
new Student() { // 本质上是一个继承了Student这个类的子类对象
public void show() {
System.out.println("Student...show......") ;
}
};