1. 函数式编程
概念:在数学中,函数是一个问题的解决方案,这个方案的重点拿什么东西就能做什么事情
对于面向对象的思想来说,我们必须明确要由哪一个类来完成这件事,但是我们的目标不是去明确哪一个类也不是去创建这个类的对象,而是完成这件事。
函数式编程思想与面向对象思想的比较:new Thread(new Runnable(){ public void run(){ //... } }).start();
new Thread(()->{ //... }).start();
Lambda
使用前提:
必须要有一个方法,方法的参数中要有接口
该接口必须是一个函数式接口(有且仅有一个抽象方法的接口)
注:使用@FunctionalInterface可以校验该接口是否是函数式接口
语法格式:
(形参参数列表)->{重写方法的方法体}
格式说明:
()
:表示实现类实现接口后重写抽象方法的参数列表(形参)->
:表示将()
中形参所接收到的数据传递给重写的方法体中{}
:表示重写方法的方法体Lambda表达式中可以省略的部分:
- 参数列表中的类型可以省略
- 如果参数列表中的参数只有一个,那么
()
也可以省略,此时参数的类型必须省略- 如果重写的方法体中只有一条语句
- 重写的方法没有返回值,
{}
也可以省略,此时该语句的;
必须省略- 重写的方法有返回值,
{}
也可以省略,此时return
和;
必须省略
常见的函数式接口:
Comsumer:消费型接口
void accept(T t):是一个用于操作指定类型数据的方法
Predicate
boolean test(T t):是一个用于针对指定类型的数据进行判断的方法
Supplier:生产型接口
T get():是一个用于获取指定类型结果的方法
Function<T,R>
R apply(T t):是一个用于将指定类型的数据转换成另一种指定类型数据的方法,根据指定类型的参数获取指定类型的返回
2. Stream流
Stream流是根据Lambda表达式引入的一个新概念,专门用于解决操作集合时的弊端
集合中最常见的操作就是遍历,要遍历集合就需要通过循环来实现,而循环并不是遍历集合的目的只是一种手段,所以我们可以通过Stream流来简化集合的遍历操作。
获取Stream流对象:
- Collection及其子类可以通过
对象名.stream()
来获取流对象- 数组可以通过Stream的静态方法
of()
来获取流对象
Stream流的常用方法:
- 延迟方法:返回值是Stream对象的方法,可以使用链式写法
- 终结方法:返回值不是Stream对象的方法
void forEach(Consumer con):终结方法,用于遍历流中的每个元素
Stream filter(Predicate pre):延迟方法:用于对流中的每个元素进行过滤
long count():终结方法,返回流中元素的个数
Stream limit(long n):延迟方法,获取流中的前n个元素
Stream skip(long n):延迟方法,跳过流中的前几个元素
Stream map(Function f):延迟方法,用于将一个指定类型的流对象转换成另一种类型的流对象
版权声明:本文为zjw1060620998原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。