java Lambda表达式
1. 理解 Lambda表达式是什么?
Lambda表达式:就是对匿名内部类的一种代替
Lambda表达式没有名称,同普通方法一样有参数列表、函数主体、返回类型等;
下面简单看一个例子:
定义一个接口,在java程序中要想使用接口必须提供该接口的实现类,实现接口的抽象方法进行使用。
public interface LambdaDemo {
void test();
}
public class LambdaDemoImpl implements LambdaDemo {
@Override
public void test() {
System.out.println("执行test方法。。。");
}
}
然后通过实现类对象进行使用。(这种是多态的体现,接口不能直接通过new来使用)
public class Test {
public static void main(String[] args) {
LambdaDemo lambdaDemo =new LambdaDemoImpl();
lambdaDemo.test();
}
}
还有一种方法就是通过匿名内部内(匿名内部类的好处就是我们不需要去专门编写一个实现类去实现接口)
public class Test {
public static void main(String[] args) {
LambdaDemo lambdaDemo = new LambdaDemo() {
@Override
public void test() {
System.out.println("执行test方法。。。");
}
};
}
}
Lambda表达式就是对匿名内部类的一种替代:
public class Test {
public static void main(String[] args) {
LambdaDemo lambdaDemo = ()->{
System.out.println("执行了方法。。。");
};
}
}
2.Lambda表达式语法
Lambda表达式语法非常简单:
() -> System.out.println("hello java8 lambda")
- ()括号里面是参数列表,如果只有一个参数还可以写为: a -> System.out.println(a)
- -> 箭头为固定写法;
- System.out.println(“hello java8 lambda”) 为函数主体,如果有多条语句要用花括号包裹起来, 比如下面这样:
(a, b) -> {int sum = a + b; return sum;}
综上,Lambda表达式模块可以固化为:
(parameter) -> {expression} 或者 (parameter) -> {statements; statements; }
有的小伙伴看到这里 可能还是有点迷茫,没关系,接着往下看,新知识的学习 是需要慢慢理解和体会的。
3. Lambda表达式的省略规则
省略规则
- 参数类型可以省略,但是有多个参数的情况下,不能只省略一个
- 如果参数有且仅有一个,那么小括号可以省略
- 如果代码块的语句只有一条,可以省略大括号和分号,甚至是return。
示例:
定义一个接口(LambdaMapper),里面定义一个抽象方法, int add(int x ,int y)
定义一个测试类(LambdaDemo),在测试类中提供两个方法
public interface LambdaMapper {
int add(int x ,int y);
}
public class LambdaDemo {
public static void main(String[] args) {
//1、在主方法中调用useAdd方法
useAdd( (int x ,int y ) ->{
//可以看做简化重写方法
return x+y;
});
}
//2、参数的类型可以省略
//注意:类型虽然可以省略,但是有多个参数的情况下不能只省略一个
useAdd( (x,y) -> {
return x+y;
});
//useAdd( (x,y) -> return x+y);
//如果有return,return也要省略,只针对代码块只有一条的情况
useAdd( (x,y) -> x+y);
useFlyable( (String s ) -> {
System.out.println(s);
});
//如果参数有且仅有一个,小括号可以省略
useFlyable( s -> {
System.out.println(s);
});
//如果代码块的语句只有一条,可以省略大括号和分号
useFlyable( s -> System.out.println(s));
}
private static void useAdd(LambdaMapper a){
int sum = a.add(10, 30);
System.out.println(sum);
}
private static void useFlyable(Flyable f){
f.fly("风和日丽,晴空万里");
}
}
4.Lambda表达式和匿名内部类的区别
(1)所需类型不同
- 匿名内部类:可以是接口,也可以是抽象类,还有可以是具体类
- lambda表达式:只能是接口
(2)使用限制不同
- 如果接口中有且仅有一个抽象方法,可以使用lambda表达式,也可以使用匿名内部类
- 如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用lambda比表达式
(3)实现原理不同
- 匿名内部类:编译之后,产生一个单独的.class字节码文件
- lambda表达式:编译之后,没有一个单独的.class文件,对应哪个的字节码会在运行的时候动态生成
– END –
日常求赞:你好技术人,先赞后看养成习惯,你的赞是我前进道路上的动力,下期更精彩。