参考视频:Lambda表达式&Stream流-函数式编程-java8函数式编程(Lambda表达式,Optional,Stream流)从入门到精通-最通俗易懂 点击观看


1 lambda表达式

举例子:(o1,o2)->Integer.compare(o1,o2);
->:lambda操作符
->左边:lambda形参列表
->右边:lambda体

在这里插入图片描述
在这里插入图片描述

总结

左边:lambda形参列表的参数类型可以省略(类型推断);如果lambda形参列表只有一个参数,其对应的()也可以省略。
右边:lambda体应该使用一对{}包裹;如果lambda体只有一条执行语句(可能是return语句,省略这一对{}和return关键字)。


2 函数式接口

如果一个接口中,只声明了一个抽象方法,那么此接口为函数式接口。
lambda表达式的本质:作为函数式接口的实例。
当需要对一个函数式接口进行实例化的时候,可以使用lambda表达式。


3 方法引用

在写完lambda表达式发现方法体只有一行代码并且是方法的调用的时候可以使用快捷键尝试转换为方法引用。


4 Stream流

对集合或者数组进行操作。

创建流

单列集合(List):集合对象.stream()
数组:Arrays.stream(数组)或者Stream.of(数组)
双列集合(Map):转换为单列集合后再创建

中间操作

filter:可以对流中的元素进行条件过滤,符合过滤条件的才能继续留在流中。
map:可以对流中的元素进行计算或者转换。
distinct:可以去除流中的重复元素。(distinct方法是依赖equals方法来判断是否是相同对象的,所以需要注意重写equals方法。)
sorted:可以对流中的元素进行排序。(如果调用空参的sorted()方法,需要流中的元素是实现了Comparable。)
limit:可以设置流的最大长度,超出的部分将被抛弃。
skip:跳过流中的前n个元素,返回剩下的元素。
flatMap:map只能把一个对象转换成另一个对象来作为流中的元素,而flatMap可以把一个对象转换成多个对象作为流中的元素。

终结操作

forEach:对流中的元素进行遍历操作。
count:可以获取当前流中元素的个数。
max:获取流中的最大值。
min:获取流中的最小值。
collect:把当前流转换成一个集合。
查找与匹配:

anyMatch:用来判断是否有任意符合匹配条件的元素,结果为boolean类型。
allMatch:用来判断是否都符合匹配条件,结果为boolean类型。
noneMatch:用来判断是否都不符合匹配条件,结果为boolean类型。
findAny:获取流中的任意一个元素。
findFirst:获取流中的第一个元素。

reduce归并:对流中的数据按照你指定的计算方式计算出一个结果。

总结

惰性求值:如果没有终结操作,那么中间操作是不会得到执行的。
流是一次性的:一个流对象经过一个终结操作后,这个流就不可以再使用。
不会影响原数据:使用流进行操作是不会影响原数据的。


5 Optional

在JDK8当中引入了Optional来优雅的避免空指针异常。
创建对象:使用Optional的静态方法ofNullable来把数据封装成一个Optional对象,无论传入的参数是否为null都不会出现问题。
安全消费值:使用其的ifPresent方法来消费其中的值。

更多推荐