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 操作是延迟执行的。这也意味着他们会等到需要结果的时候才执行。
网友评论