Lambda表达式学习

文章介绍了Lambda表达式如何简化Java代码,从匿名内部类转换为Lambda形式,并解释了Lambda表达式的组成部分和函数式接口的概念。通过示例展示了Lambda在函数式接口中的应用,以及代码的简化规则。
摘要由CSDN通过智能技术生成


在这里根据上课学到的内容,结合自己的理解对Lambda表达式进行介绍。
从内部类,主要是匿名内部类,到Lambda表达式。在课下尝试复刻代码时,发现将部分代码折叠起来后,有些代码部分代码变成了Lambda表达式的形式。
例如:

这是我课下写的一个匿名内部类,运行效果与创建一个子类继承一样,不同的是匿名内部类不知道它的名字。在我将这部分代码折叠起来后,该部分代码就变成了另外一种形式,见第二张图。
在这里插入图片描述
在我将上部分代码折叠起来后,就变成了如下的形式。结合上课讲起的Lambda表达式的样子,我知道,系统帮我折叠出来的这代码和我写的匿名内部类部分代码是同一个东西,只是说()和箭头将匿名实现部分隐藏起来了 ,只剩下输出的内容。这个形式与Lambda表达式非常像,我猜想Lambda表达式是否可以理解为隐藏了一个匿名的函数或者说类。
在这里插入图片描述

Lambda

Lambda表达式可以理解为三部分:(),->,{ }。
一般形式:() -> {},基本上见到的Lambda表达式都是这个样子,第一个括号里的应该是放一个类似参数列表的东西,->理解为被用于的意思,第二个括号,就相当于一个{},里面放的是代码,就像返回什么,或者输出什么。课上并没有对这个进行详细的讲解,毕竟代码这个东西,讲的再好,不如理解的透彻。所以我认为这里稍微理解以一下就好,不必死抓每个括号到底放什么东西。

函数式接口

学习Lambda表达式,可能还需要了解一下函数式接口。这个是使用Lambda的前提条件,
函数式接口简而言之就是,一种接口,接口要求只能有一个抽象的方法。
如果一个接口只有一个抽象方法,那么它就属于函数式接口。
与方法重写一样,函数式接口也有类似的注释:@FunctionalInterface 注解
这个注释可以帮助我们检测是不是函数式接口,如果有两个就会编译报错。
总而言之,使用Lambda表达式,要求是函数式接口。
如果不是,写不出来Lambda的。
如我下面的示例:
我创建了一个接口,在接口中写了匿名内部类,来观察运行结果和我创建子类实现接口的运行效果是否一样。

package com.内部类.匿名内部类.接口匿名内部类;

import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;
public interface Animal {
    void feed();
    void eat();

    public static void main(String[] args) {
        cat a1=new cat();
        a1.feed();
        a1.eat();
        Animal a2=new Animal() {
            @Override
            public void feed() {
                System.out.println("买饭吃");
            }
            @Override
            public void eat() {
                System.out.println("吃饱了");
            }
        };
        a2.eat();
        a2.feed();
   }
}
class cat implements Animal{
    @Override
    public void feed() {
        System.out.println("给猫喂水");
    }

    @Override
    public void eat() {
        System.out.println("猫喝水");
    }
}

但我突发奇想,想在这个接口中写一个Lambda表达式。此时我并未考虑是否是函数式接口。
我尝试写上这样一个代码。

        Animal a3=()->{
            System.out.println("sdf");
            System.out.println("ssc");
        };

在我写的时候系统就已经划了红线,但我还是运行了。结果不出所料:
在这里插入图片描述
结合起现在对函数式接口的理解。说明Lambda表达式确实只能在函数式接口中使用。
此时我重写一个接口:

package com.Lambda表达式;

public interface Animal {
    public abstract void eat();
}

这个接口只有一个抽象的方法。
为了将近期学的东西联系一下,我将简单的匿名内部类也加了进去,方便对比一下。
于是在mian方法里,我写上了匿名内部类,Lambda表达式,接口实现类。

package com.Lambda表达式;


public class zoo {
    public zoo() {
    }

    public static void main(String[] args) {
        Animal a=new Animal() {
            @Override
            public void eat() {
                System.out.println("吃肉");
            }
        };
        Animal a1=new ship();
        a.eat();
        a1.eat();
        Animal a3=()->{
            System.out.println("吃饭");
        };
        a3.eat();
}
}

在上面代码简单的将三个内容加进去了。他们的运行效果是一样的。

Lambda表达式在简化

尽管我认为使用Lambda表达式已经非常的简洁了,但是Lambda确实还可以继续精简。不过过于精简,它的阅读性就不好了。就行我上面的Lambda表达式由于只有一个语句,所以说大括号可以省略。
如果Lambda表达式的参数列表是有多个参数,那么括号不能省略
如果Lambda表达式的语句部分也就是{}部分,有多个语句,那么括号也不能省略。
一般写代码也不会写的这么精简,使用只简单介绍几条简化要求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值