前言
lambda表达式 1.8开始 函数式编程:强调做什么
一、成员内部类
class outer {
int a = 0;
class inner {
int a = 20;
void show() {
int a = 30;
System.out.println(a); // 30
System.out.println(this.a);// 20
//访问外部类的方式
System.out.println(outer.this.a);// 0
}
}
}
//创建方式
outer.inner inner = new outer().new inner();
inner.show();
二、成员静态内部类
class Outer{
static class inner{
void show(){};
}
}
//创建方式
Outer.inner inner = new Outer.inner();
inner.show();
三.局部内部类
class Outer{
class inner{
void show(){
//只供本方法使用
class methodInner{
}
};
}
}
四.匿名内部类
-
lambda格式:(特别的匿名内部类)
(形式参数)->{代码块} 多个参数用,分隔
前提:有一个接口,接口有且只有一个抽象方法 -
lambda省略规则:参数类型要么都不写,要么都写,且要按顺序写
如果参数只有一个小括号可以不写
如果代码块只有一条,可以省略掉大括号和分号,甚至return -
lambda与匿名内部类不同:
匿名内部类可以实现接口也可以是抽象类还可以是具体类 lambda只能是接口
如果有多个抽象方法不能使用lambda表达式
匿名内部类编译完成之后是一个独立的class文件
lambda是在运行的时候动态的生成字节码
interface inter{ //接口形式
void show();
}
//实现
new inter() {
@Override
public void show() {
}
}.show(); //·show()之前代表本对象
class inter1{ //类形式
void show(){
System.out.println("show");
}
}
//实现
new inter1(){
@Override
void show() {
super.show();
}
};
五.lambda表达式
interface inter{ //lambda表达式只能对一个抽象方法的接口使用
void show();
}
interface inter1{
int add(int a, int b);
}
//实现
inter i=()-> System.out.println("a");
adds((int a,int b)->{return a+b;},1,2);
}
static void adds(inter1 i,int num1,int num2){
System.out.println( i.add(num1,num2));
}