读书笔记,资料来自Java8 实战
我觉的它是匿名内部类的优化,省略了匿名内部类许多不必要的代码。而更简洁的表达匿名内部类的参数所要实现的功能。它基本上就是没有声明名称的方法,但和匿名类一样,它也可以作为参 数传递给一个方法(传递参数的行为)
一、使用场景
在函数式接口上使用Lambda表达式
二、语法特点
1.简洁:无需像匿名内部类那样写许多模板代码
2.传递:可以作为参数传递
3.语法:它不是一种特定的函数,只是一种特定的写法和条件所组成的函数。
三、语法结构
参数列表:原来匿名内部类中的参数
箭头:指向参数要做的事情
主体:接口方法中具体的实现,因为Lambda表达式只能作用在函数式接口上,主体对应的就是接口方法具体的功能
四、使用Lambda表达式步骤
1.定义函数式的接口实现功能,即将方法的部分行为使用接口的形式参数化
2.将方法的参数设定位定义好的接口
3.使用Lambda表达式为接口方法传递具体的功能实现
Lambda和内部类的对比
1.使用内部类的方式传递实现,无疑功能会被写死
2.而使用Lambda表示的方式传递实现,可以动态的为process(String name)方法传递它的实现。
对比语法结构:(name)表示需要传递实现的方法的参数列表,箭头指向,该方法具体的实现。
五、使用Java8提供函数描述符
1.接口抽象方法的名字,可以表述Lambda表达式主体所要实现的功能的含义。因此想要表述一些功能就需要定义函数式接口,Java8提供了几个函数式接口,省的我们自己定义接口。
例如OnPorcess接口的process方法的名称描述了name+“ Hello“ 索要表达的含义
**1.Predicate Interface **
做条件判断时可以使用
public interface Predicate<T>{
boolean test(T t);
}
2.Consumer Interface
没有返回值,只需要实现具体的功能时可以使用。
@FunctionalInterface
public interface Consumer<T>{
void accept(T t);
}
3.Function Interface
有泛型返回值的方法,将一种输入类型转换成类一种类型输出
@FunctionalInterface
public interface Function<T, R>{
R apply(T t);
}
使用上述三个接口
传入Lambda表达式
**五、如何处理异常
任何Java提供的函数式接口都不能处理异常,如何想要处理异常需要自己定义函数式接口,并抛出异常,或者在执行方法时try-catch住。