JDK8的重要新特性之一——Lambda表达式:
Lambda 表达式也可称为闭包,是推进 Java 8 发布的最重要新特性。Lambda表达式实质上是一个匿名方法,Lambda容许把函数做为一个方法的参数(函数做为参数传递进方法中)或者把代码当作数据。使用 Lambda 表达式可使代码变的更加简洁紧凑。java
Lambda表达式的语法结构:
(参数列表) -> {代码块}编程
须要注意:数组
· 参数类型可省略,编译器能够本身推断 · 若是只有一个参数,圆括号能够省略 · 代码块若是只是一行代码,大括号也能够省略 · 若是代码块是一行,且是有结果的表达式, return 能够省略闭包
(param1,param2)->{ } (type1 param1,type2 param2)->{ body } 箭头左边是抽象方法的参数 右边是抽象方法实现体
1)一个Lambda表达式能够有零个或多个参数。 2)全部参数须要包含在圆括号内,参数之间用逗号相隔。 3)圆括号表明参数集为空。例如()->42. 4)参数的类型既能够明确声明,也能够根据上下文来推断。app
函数式接口:
只包含一个抽象方法的接口,称为函数式接口;函数式编程
Runnable 、Comparator 都是函数式接口的典型表明。在实践中,函数接口是很是脆弱的,只要有人在接口里添加多一个方法,那么这个接口就不是函数接口了,就会致使编译失败。Java8提供了一个特殊的注解@FunctionalInterface 来克服上面提到的脆弱性而且显示地代表函数接口。函数
1,Function类型接口:code
@FunctionalInterface public interface Function<T,R> { //接收一个参数T,返回一个结果R R apply(T t); }
【Function表明的是有参数,有返回值的函数。】对象
2,Consumer系列:接口
@FunctionalInterface public interface Consumer<T> { //接收T类型参数,不返回结果 void accept(T t); }
【Consumer系列与Function系列同样,有各类衍生接口,但不返回任何结果。】
3, Predicate系列:
@FunctionalInterface public interface Predicate<T> { //接收T类型参数,返回boolean类型结果 boolean test(T t); }
Java 内置四大核心函数式接口:
- Consumer<T>: 消费型接口,表示一个接受单个输入参数并返回没有结果的操做。对类型为T的对象应用操做。接口方法: void accept(T t)
- Supplier<T>: 供给型接口,相似一个供应商,返回一个类型为T的对象。接口方法: T get()
- Function<T, R>: 函数型接口,表示一个接受一个参数并产生结果的函数。接口方法: R apply(T t)
- Predicate<T>: 断言型接口,肯定类型为T的对象是否知足某约束,并返回boolean 值。接口方法: boolean test(T t)
StreamAPI:
Java8中有两大最为重要的改变。第一个是 Lambda 表达式;另一个则是 Stream API。
新增的Stream API(java.util.stream)将生成环境的函数式编程引入了Java库中。这是目前为止最大的一次对Java库的完善,以便开发者可以写出更加有效、更加简洁和紧凑的代码。
流(Stream)究竟是什么?
是数据渠道,用于操做数据源(集合、数组等)所生成的元素序列。
Stream 的操做三个步骤:
- 建立 Stream: 一个数据源(如:集合、数组),获取一个流。
- 中间操做: 一个中间操做链,对数据源的数据进行一系列处理。
- 终止操做(终端操做): 一个终止操做,执行中间操做链,并产生结果。
注意:
- Stream 本身不会存储元素。
- Stream 不会改变源对象。相反,他们会返回一个持有结果的新 Stream。
- Stream 操做是延迟执行的。这也意味着他们会等到须要结果的时候才执行。