Lambda表达式
在这里根据上课学到的内容,结合自己的理解对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表达式的语句部分也就是{}部分,有多个语句,那么括号也不能省略。
一般写代码也不会写的这么精简,使用只简单介绍几条简化要求。