Lambda表达式使用及注意事项

Lambda表达式的使用前提 :

1、必须有接口,且接口中有且仅有一个抽象方法 。

2、必须有上下文环境,才能推倒出Lambda对应的接口,比如在主方法main中写()-> System.out.print("OK"),没人知道什么意思,也没有意义,但是如果写成Runnable r = ()-> System.out.print("OK"),就知道他是实现Runnable接口的,接下来就可以新建一个线程来启动程序:new Thread(r).start()。或者直接写成:new Thread( () -> System.out.print("OK") ).start(),也能明白其意思。

在main主方法里面用Lambda表达式:()->{需求或解决方案},相当于在main主方法里面的匿名内部类里面重写方法,以实现需求或解决方案。上面蓝色带下划线的部分实际上是一个抽象方法的重写,()内的参数即是抽象方法的参数,{}里面的内容即是抽象方法的方法体。

主要目的是省去了 新建一个实现类来实现接口,把实现接口的重写方法,放在主方法里面来重写了,用Lambda表达式的写法比匿名内部类的写法,简化了很多。

调用接口时,直接新建一个方法fun(interface),把接口当做参数,再在主方法里调用此方法fun(interface ),同时实现interface内的方法,即需求。亦即:在在Lambda表达式()里面放置接口内方法的参数,在Lambda表达式方法体{...}里面实现接口方法,以替代接口的实现类。{...}结果,作为参数传递给fun(),可以理解为该参数是接口的实现类对象,因为{...}就是替代接口的实现类的。

代码示例如下:

public interface Eatable {
   void eat();
}
public class EatTest {
    public static void main(String[] args) {

       fun(new Eatable() {
           @Override
           public void eat() {
               System.out.println("羊吃草1");
           }
       });//羊吃草1

       fun(()->{
           System.out.println("羊吃草2");
       });//羊吃草2

    }

    public static void fun(Eatable e){
        e.eat();
    }
}

如果接口里面的方法有参数,在Lambda表达式的()里面加上参数即可,多个参数之间有逗号隔开:(参数1,参数2)->{...},

{...}代码块里面的内容,实际上就是接口实现类里面重写的方法体,用Lambda表达式之后,有两个好处:

1、可以省去了接口实现类;2、简化了匿名内部类的繁琐。直接在主方法里面实现方法体了。

注意:

1、表达式的参数类型可以省略,且必须同时省略,或都不省略,不能只省略一个而其他的不省略。如(int a, int b)可以写成 :(a, b)->{...}。

2、如果只有一个参数,Lambda表达式的(parameter)可以省略括号直接写参数:parameter。

3、如果{...}代码块的语句只有一条,(1)可以省略大括号和分号: parameter -> 方法体... 。(2)如果{...}代码块里面有返回值,需要return result ,return也要省略:parameter -> result 。 例子中的调用构造方法就可以写成:fun(parameter -> result);

 

另外注意:匿名内部类与Lambda表达式的区别:
1、所需类型不同。匿名内部类:可以是接口、抽象类、具体类。Lambda表达式:只能是接口

2、使用限制不同。如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类。 如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式 

3、实现原理不同。匿名内部类虽然跟使用Lambda效果一样,但是会自动多生成一个.class字节码文件,只是我们在写的时候没有发觉,这也是匿名内部类跟Lambda的区别,Lambda的字节码文件会动态生成,我们看不见,这个知道即可,在具体编程中感受不到,对于初学者或一般开发作业中不必过多关注。
代码示例详见https://blog.csdn.net/timon777/article/details/103935384

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lambda表达式有几个注意事项需要注意。首先,Lambda表达式只能用于接口,而匿名内部类可以适用于接口、抽象类和具体类。其次,如果接口中只有一个抽象方法,则可以使用Lambda表达式或匿名内部类来实现。但是,如果接口中有多个抽象方法,则只能使用匿名内部类,不能使用Lambda表达式Lambda表达式的标准格式为(形式参数)-> {代码块},如果有多个参数,需要用逗号隔开;如果没有参数,需要留空。需要注意的是,箭头->是固定写法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Lambda表达式使用注意事项](https://blog.csdn.net/timon777/article/details/103931965)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Lambda表达式的标准格式和省略模式以及注意事项](https://download.csdn.net/download/weixin_38571878/14884074)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值