Kotlin中大量使用了Lambda表达式,Java中使用的比较少。毕竟和Java最初的设计思想不是很一致。
函数式编程思想的概述:忽略面向对象的复杂语法,强调做什么,而不是以什么形式做。
想做什么,而不是怎么做。
Java8中加入了lambda表达式
()-> sout("多线程任务执行");
1.前面一对小括号即run方法的参数,代表不需要任何条件。
2.中间箭头代表将前面的参数传递给后面的代码;
3.后面的输出语句即业务逻辑代码。
Lambda表达式,标准格式:三部分
1.一些参数
2.一个箭头
3.一段代码
Lambda省略格式:可推导就可省略。
Lambda使用前提:
1.使用Lambda必须具有接口,且要求接口中有且仅有一个抽象方法。
2.使用Lambda必须具有上下文推断。
备注:有且仅有一个抽象方法的接口,称为--函数式接口
在Java中有且仅有一个抽象方法的接口。
语法糖:是指使用更加方便,但是原理不变的代码语法。
从应用层面来讲,Java中的Lambda可以被当做是匿名内部类的语法糖,但是二者在原理上是不同的。
函数式接口:有且只有一个抽象方法的接口,但是可以包含其他方法(默认,静态,私有);
public interface 接口名称{
返回值类型 方法名(参数列表);
}
@FunctionalInfterface 函数式接口的注解。
作用:可以检测接口是否是一个函数式接口
是:编译成功
否:编译失败(接口中的抽象方法个数多余1个)
使用:一般可以作为方法的参数和返回值类型;
日志工具类:一般有7个级别,根据日志的级别,显示日志信息的方法。
Lambda特点:延时加载,使用前提,必须有函数式接口。满足条件才能执行,不满足条件不执行。
Lambda做为参数。
Lambda做为返回值。
常用的函数式接口:java.util.function
1.Supplier接口:T get().用来获取一个泛型参数指定类型的对象数据。
被称为生产型接口,指定接口的泛型是什么类型,那么接口中的get方法就会产生什么类型的数据。
2.consumer接口:
void accept(T t)用于消费一个指定泛型的数据。默认方法andThen(),可以把两个Consumer接口组合到一起,在对数据进行消费。
3.Predicate接口:对某种类型数据进行判断。boolean test(T t),默认方法and,or,negate,对应着与或非三个逻辑运算符。 可以用于对数据集合中的数据进行筛选。
4.Function接口:Function<T,R>用来根据一个类型的数据得到另一个类型的数据,前者为前置条件,后者为后置条件。也成为转换接口。
抽象方法:R apply(T t);传入T类型参数,获取R类型结果。
默认方法:andThen可以把两个接口组合到一块。