Lambda表达式
概述
JDK8开始一个新语法,它是一个代替语法
Lambda表达式简化对于接口的实现类对象实现,本质是一个匿名内部类的简易实现
编程思想
“面向对象”的编程思想:必须依靠对象,通过对象调用方法来完成功能
例如:使用线程的步骤
方式1:1,定义Runnable实现类2,创建实现类对象3,传入实现类对象
方式2:匿名内部类
“面向过程”—>函数式编程思想:在写法上要比较简洁,注重代码的实现过程
例如:使用线程的步骤:不需要定义实现类;不需要创建具体的子类对象;只需要传入一个“方法”即可
Lambda标准格式
前提
必须具有接口,且要求接口中有且仅有一个抽象方法
有且仅有一个抽象方法的接口,称为函数式接口
@FunctionInterface注解:检查一个接口是否是函数式接口
格式
(参数类型 参数名)—>{代码语句}
()内的语法与传统方法参数列表一致:无参数则留空,多个参数则用逗号分隔
— >是新引入的语法格式,代表指向动作
{}内的语法与传统方法体要求基本一致
Lambda省略格式
省略要求
小括号内参数的类型可以省略
如果小括号内有且仅有一个参数,则小括号和参数类型可以一起省略
大括号内有且仅有一个语句,则可以同时省略((一对大括号+语句后的分号))
如果大括号内仅有的一个语句是return语句,则return也可以省略(大括号+分号+return必须同时省略)
Lambda应用场景
应用场景
创建对象,赋值给变量
在调用方法时,作为“实参”
作为方法的返回值
Stream流
Stream概述
介绍
JDK8中为了支持Lambda,制作了一些应用,Stream就是一个典型的应用
Java.util.stream<T>是java 8新加入的最常见的流接口
Stream流:是一个接口,功能类似于迭代器,但更强大,可以对数据进行过滤,筛选,汇总等操作
思想
Stream流,类似于车间的流水线,每次操作流,都可以将结果发送给下一个操作
Stream流基于一定的函数模型思想设计,目的是为了拥有更好的性能和便利性
Stream流包含了过滤,映射,跳过,计数等模型,调用指定方法,会使流模型转为另一个流模型
Stream中将操作模型分为了延迟性与终结性两种,以便更好的执行流策略
特点
Stream流是一次性的,不能重复使用,当执行流 的某个方法,这个流将会失效,并将结果存储到新流中
Stream流不会存储数据
Stream流不会修改数据源
Stream流搭建的函数模型,只有终结方法存在,前面的延迟性方法才会执行
Stream对象
集合获取Stream流
java.util.Collection接口中加入了default Stream<E> stream()方法来获取流,即所有的单列集合均可以获取流
Java.util.Map接口未提供获取流的方法,需分别根据其键和值的集合后再获取流对象
数组获取Stream流
数组对象没有方法,所以Stream接口中提供了静态方法static<T> Stream<T> of(T... t) 方法获取数组对应的流
Stream常用功能
终结方法
返回值类型不再是Stream接口的方法,不支持链式调用
统计个数 long count()返回流中的元素个数
逐一处理 void forEach(Consumer <? super T >action) 对此流中的每个元素进行操作
非终结方法(函数拼接方法)
返回值类型仍然是Stream接口方法,支持链式调用
过滤 Stream<T> filter(Predicate <? super T> priedicate) 返回经过筛选,满足的条件的元素组成的流
取前n个 Stream<T> limit(long maxSize) 返回由此流(包含)第maxSize个之前的元素组成的
跳过前n个 Stream<T> skip(long n) 返回由此流(不含)第n个之后元素组成的流
映射 <R>Stream<R> map(Function< ? super T, ? extends R> mapper) 返回流中旧元素经指定转换后的新元素组成的流
组合 static<T> Stream<T> concat (Stream <? extends T> a,Stream <? extends T>) 返回将两个流中的元素合并到一起,组成新流
Stream收集数据
收集结果到集合
具备终结性,不支持链式调用
R collect (Collector<T ,A, R> coll):转换为指定的集合,R代表最终转换为的集合的具体类型
java.util.stream.Collectors类提供一些方法,可以作为Collector接口的实例
收集结果到数组
数组具备终结性,不支持链式调用
Object[] toArray():转换为Object数主