阶段二16_面向对象高级_lambda1

知识点:

 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
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java之书

会持续更新实用好的文章谢谢关注

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值