共计 1621 个字符,预计需要花费 5 分钟才能阅读完成。
JDK8 的重要新个性之一——Lambda 表达式:
Lambda 表达式也可称为闭包,是推动 Java 8 公布的最重要新个性。Lambda 表达式本质上是一个匿名办法,Lambda 容许把函数作为一个办法的参数(函数作为参数传递进办法中)或者把代码看成数据。应用 Lambda 表达式能够使代码变的更加简洁紧凑。
Lambda 表达式的语法结构:
(参数列表) -> {代码块}
须要留神:
· 参数类型可省略,编译器能够本人推断
· 如果只有一个参数,圆括号能够省略
· 代码块如果只是一行代码,大括号也能够省略
· 如果代码块是一行,且是有后果的表达式,return 能够省略
(param1,param2)->{ }(type1 param1,type2 param2)->{body}
箭头右边是形象办法的参数 左边是形象办法实现体
1)一个 Lambda 表达式能够有零个或多个参数。
2)所有参数须要蕴含在圆括号内,参数之间用逗号相隔。
3)圆括号代表参数集为空。例如()->42.
4)参数的类型既能够明确申明,也能够依据上下文来推断。
函数式接口:
只蕴含一个形象办法的接口,称为函数式接口;
Runnable、Comparator 都是函数式接口的典型代表。在实践中,函数接口是十分软弱的,只有有人在接口里增加多一个办法,那么这个接口就不是函数接口了,就会导致编译失败。Java8 提供了一个非凡的注解 @FunctionalInterface 来克服下面提到的脆弱性并且显示地表明函数接口。
1,Function 类型接口:
@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 操作是提早执行的。这也意味着他们会等到须要后果的时候才执行。