Lambda表达式和stream(流)
Lambda表达式
1.出现的背景
java是面向对象语言,除了部分简单数据类型(基本数据类型),java中的一切都是对象。在java中定义的函数或方法不可能完全独立,也不能将方法作为参数或返回一个方法给实例。java8之前,若我们想要把这些功能传递给某个方法,需要写内部类。
在java8之前,想要在java中将普通的方法或函数像参数一样传值并不简单,为此,java8增加了Lambda表达式。
2.Lambda表达式
Lambda表达式是一个匿名函数,可以把Lambda表达式理解为一段可以传递的代码。
Lambda表达式的本质是“语法糖”,由编译器推断并帮你转换包装为常规的代码。
关于语法糖:指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。
java中Lambda表达式通常使用(arguement)->{body}语法书写。
3.什么是Functional interface(功能性接口)
Lambda表达式只支持函数式接口,也就是只有有一个抽象方法的接口。功能接口是java8中的新增功能,它们只允许一个抽象方法。这些接口也被称为单抽象方法接口
引入了一个注释@FunctionalInterface,当你注释的接口违反了FunctionalInterface的规则时,出现编译期错误。
Stream(流)
steam是java8的新特性,它允许你一声明式的方式处理数据集合,可以把它看做是遍历数据集的高级迭代器。
注意!:要分清java8中stream和InoutStrean与OutStream是是不同的概念。
这里使用的就是java8中的stream流,使用声明性方法写的:说明想要完成什么,而不是说明如何去实现一个操作。
流
就是从支持数据处理操作的源,生成的元素序列。
元素列表:和集合一样,流也提供了一个接口,访问特定元素类型的一组有序值。
数据源:获取数据的源,比如集合
数据处理操作:流更偏向用于数据处理和计算,比如filter,map,sort等。
简单地说,我们通过一个集合的stream方法获取一个流,然后对流进行一系列流操作,最后再构建我们需要的数据集合。
在java中,数列和集合通常是用于存放数据的,而流是用来操作集合中的数据的。
流操作
流操作分为两种:中间操作和终端操作。
数据源 -> 中间操作 -> 终端操作 -> 结果
诸如fielter或者sort等中间操作会返回另一个流,进而进行下一步流操作,而终端操作则是将流关闭,创建新的数据集合对象(也可不构建)
流操作详细
获取流
stream()
中间操作
filter :过滤流中的某些元素
sorted() :自然排序,流中元素需实现Comparable接口
distinct :去除重复元素
limit(n) :获取n个元素
skip(n) :跳过n个元素,配合limit(n)可实现分页
map() :将其映射一个新的元素
终端操作
forEach :遍历流中的元素
toArray :将流中的元素倒入一个数组
Min :返回流中元素最小值
Max :返回流中元素最大值
count :返回流中元素的总个数
Reduce :所有元素求和
anyMatch :接受一个predicate函数,只要流中有一个元素满足条件则返回true,反之false。
allMatch :接收一个predicate函数,当流中每个元素都符合条件时才返回true,反之false。
findFirst :返回流中第一个元素。
collect :将流中的元素倒入一个集合,Collection或Map