知识点:
1)Lambda表达式的标准格式
2)Lambda使用前提条件
3)Lambda有参数有返回值练习
步骤1创建一个接口写一个抽象类;
步骤2:在类中创建一个方法参数并接口对象;
步骤3:使用类的中调用含有接受接口对象参数方法,就可以使用lambda表达式
4)Lambda表达式和匿名内部类的区别
一.体验Lambda表达式
函数式思想则尽量忽略面向对象的复杂语法:“强调做什么,而不是以什么形式去做”
而我们要学习的Lambda表达式就是函数式思想的体现
---使用lambda表达式显示匿名内部类调用----
public class LambdaDemo1 {
public static void main(String[] args) {
/* 理解: 对于Lambda表达式, 对匿名内部类进行了优化 */
goSwimming( () -> {System.out.println("铁汁, 我们去游泳吧~") } );
}
public static void goSwimming(Swimming swimming) {
swimming.swim();
}
}
/* 游泳接口*/
interface Swimming { void swim(); }
-------------------------------------
二.Lambda表达式的标准格式
1.格式:( 形式参数 ) -> { 代码块 }
2.形式参数:如果有多个参数,参数之间用逗号隔开;如果没有参数,留空即可
3.->:由英文中画线和大于符号组成,固定写法。代表指向动作
4.代码块:是我们具体要做的事情,也就是以前我们写的方法体内容
三.Lambda使用前提条件
1.有一个接口
2.接口中有且仅有一个抽象方法
四.练习lambda表达式
练习1:
编写一个接口ShowHandler
在该接口中存在一个抽象方法show,该方法是无参数无返回值
在测试类ShowHandlerDemo中存在一个方法useShowHandler,方法的的参数是ShowHandler类型的,在方法内部调用了ShowHandler的show方法
---练习1,lambda无参数------------
// 编写一个接口ShowHandler
interface ShowHandler {
//在该接口中存在一个抽象方法show,该方法是无参数无返回值
void show();
}
//在测试类ShowHandlerDemo
public class TestLambda {
public static void main(String[] args) {
// Lambda实现
useShowHandler( () -> System.out.println("我是Lambda中的show方法"));
}
//存在一个方法useShowHandler,方法的的参数是ShowHandler类型的,在方法内部调用了ShowHandler的show方法
public static void useShowHandler(ShowHandler showHandler){
showHandler.show();
}
}
-----------------------------------
---练习2,lambda带参数-------------
public class StringHandlerDemo {
public static void main(String[] args) {
// Lambda实现
useStringHandler( (String msg) -> {System.out.println("我是Lambda表达式" + msg);} ,"gx");
}
public static void useStringHandler(StringHandler stringHandler,String msg){
stringHandler.printMessage(msg);
}
}
interface StringHandler { void printMessage(String msg);}
结果:
我是Lambda表达式gx
-----------------------------------
---练习3,lambda有返回值无参--------
public class RandomNumHandlerDemo {
public static void main(String[] args) {
// 注意: 如果lambda所操作的接口中的方法, 有返回值, 一定要通过return语句, 将结果返回。否则会出现编译错误
useRandomNumHandler(
() -> {
Random r = new Random();
int num = r.nextInt(10) + 1;
return num;
}
);
}
public static void useRandomNumHandler(RandomNumHandler randomNumHandler){
int result = randomNumHandler.getNumber();
System.out.println(result);
}
}
interface RandomNumHandler { int getNumber();}
-----------------------------------
---练习4,lambda有返回值有参数------
public class CalculatorDemo {
public static void main(String[] args) {
useCalculator (
/**
理解过程
(int a, int b)->{ return a+b; }
当作接口的实现类对象,并实现了接口方法的业务代码[return a+b;]
class T implements Calculator{public int calc(int a, int b) { return a+b; }}
*/
(int a, int b)->{ return a+b; }
);
}
public static void useCalculator(Calculator calculator){
int result = calculator.calc(10,20);
System.out.println(result);
}
}
interface Calculator { int calc(int a, int b); }
-----------------------------------
五.Lambda表达式的省略模式
1.省略规则:
1) 参数类型可以省略,但是有多个参数的情况下,不能只省略一个
2) 如果参数有且仅有一个,那么小括号可以省略
3) 如果代码块的语句只有一条,可以省略大括号和分号,甚至是return
六.Lambda表达式和匿名内部类的区别
1.所需类型不同
匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
Lambda表达式:只能是接口
2.使用限制不同
如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类
如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式
3.实现原理不同
匿名内部类:编译之后,产生一个单独的.class字节码文件
Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成
七.更多精彩内容
地址:http://www.gxcode.top/code