函数式编程
函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
Lambda表达式
(s1, s2) -> {
return s1.compareTo(s2);
}
Arrays.sort(array, (s1, s2) -> s1.compareTo(s2));FunctionalInterface
定义了单方法的接口称之为FunctionalInterface,用注解@FunctionalInterface标记
单方法接口被称为FunctionalInterface。
接收FunctionalInterface作为参数的时候,可以把实例化的匿名类改写为Lambda表达式,能大大简化代码。
Lambda表达式的参数和返回值均可由编译器自动推断。
@FunctionalInterface
public interface Callable<V> {
V call() throws Exception;
}因为Comparator接口定义的方法是int compare(String, String),和静态方法int cmp(String, String)相比,除了方法名外,方法参数一致,返回类型相同,因此,我们说两者的方法签名一致,可以直接把方法名作为Lambda表达式传入
在这里,方法签名只看参数类型和返回类型,不看方法名称,也不看类的继承关系
方法引用
静态方法
实例方法
构造方法
FunctionalInterface允许传入:
接口的实现类(传统写法,代码较繁琐);
Lambda表达式(只需列出参数名,由编译器推断类型);
符合方法签名的静态方法;
符合方法签名的实例方法(实例类型被看做第一个参数类型);
符合方法签名的构造方法(实例类型被看做返回类型)。
FunctionalInterface不强制继承关系,不需要方法名称相同,只要求方法参数(类型和数量)与方法返回类型相同,即认为方法签名相同。
stream
划重点:这个Stream不同于java.io的InputStream和OutputStream,它代表的是任意Java对象的序列
java.io
java.util.stream
存储
顺序读写的byte或char
顺序输出的任意Java对象实例
用途
序列化至文件或网络
内存计算/业务逻辑
再次划重点:这个Stream和List也不一样,List存储的每个元素都是已经存储在内存中的某个Java对象,而Stream输出的元素可能并没有预先存储在内存中,而是实时计算出来的。
List的用途是操作一组已存在的Java对象,而Stream实现的是惰性计算,两者对比如下:
java.util.List
java.util.stream
元素
已分配并存储在内存
可能未分配,实时计算
用途
操作一组已存在的Java对象
惰性计算
Stream API的特点是:
Stream API提供了一套新的流式处理的抽象序列;
Stream API支持函数式编程和链式操作;
Stream可以表示无限序列,并且大多数情况下是惰性求值的。
创建stream
Last updated
Was this helpful?