Java8 新特性
前言
Java8 有一个非常显著的特点,就是提供了函数式编程,本文也将介绍 Java8 的几个新特性来实现函数式编程。学会这些 API 能够编写出简单、干净、易读的代码(尤其是对集合的操作)。Java8 新特性包括:
- Lambda 表达式
- Stream API
- 接口新特性
- 函数式接口(
@FunctionalInterface
) - 默认方法(
default
)
- 函数式接口(
- Optional API
- 方法引用
JDK8 新特性
正在努力更新中…
函数式接口
- 只包含了一个抽象方法的接口,称为函数式接口(可以有多个非抽象方法)。可以使用
@FunctionalInterface
注解自定义声明
1 | //JDK 1.8 之前已有的函数式接口: |
Lambda 表达式
Lambda
表达式的使用依赖于函数式接口- 使用
Lambda
表达式来表示函数式接口的实现(JAVA 8 之前一般是用匿名类实现的)
语法格式
-> :Lambda操作符
-> 左边(parameters):Lambda形参列表
(相当于接口中的抽象方法的形参列表)
- 参数类型可以省略,可由编译器推断得出(类型推断)
- 如果只有一个参数,
()
也可以省略
-> 右边:Lambda体
(重写的抽象方法的方法体)
- 如果只有一条执行语句,
{}
及return
可以省略
1 | (parameters) -> expression |
使用案例
使用案例 | Lambda 的例子 | 对应的函数式接口 |
---|---|---|
布尔表达式 | (List<String> list) -> list.isEmpty() |
Predicate<List<String>> |
创建对象 | () -> new Project() |
Supplier<Project> |
消费一个对象 | (Project p) -> System.out.println(p.getStars()) |
Consumer<Project> |
从一个对象中选择/提取 | (int a, int b) -> a * b |
IntBinaryOperator |
比较两个对象 | (Project p1, Project p2) -> p1.getStars().compareTo(p2.getStars()) |
Comparator<Project> 或 BiFunction<Project, Project, Integer> 或 ToIntBiFunction<Project, Project> |
方法引用
语法格式
- 使用操作符
::
类或对象与方法名分割 - 主要有三种使用情况
对象::
实例方法名
类::
实例方法名
类::
静态方法名
使用案例
1 | LambdaQueryWrapper<SysDictItem> queryWrapper = new LambdaQueryWrapper<SysDictItem>(); |
Stream API
- 使用
Stream API
对集合数据进行操作 stream
和collection
集合的区别collection
是一种静态的内存数据结构,而stream
是有关计算的,前者主要面向内存,存储在内存中,后者主要面向cpu
,通过cpu
计算实现
Stream
的创建方式
1 | //1.通过集合创建 |
- 中间操作
1 | //中间操作 |
- 终止操作
1 | //终止操作 |
中间操作和收集操作
操作 | 类型 | 返回类型 | 使用的类型/函数式接口 | 函数描述符 |
---|---|---|---|---|
filter |
中间 | Stream<T> |
Predicate<T> |
T -> boolean |
distinct |
中间 | Stream<T> |
||
skip |
中间 | Stream<T> |
long |
|
map |
中间 | Stream<R> |
Function<T, R> |
T -> R |
flatMap |
中间 | Stream<R> |
Function<T,Stream<R>> |
T -> Stream<R> |
limit |
中间 | Stream<T> |
long |
|
sorted |
中间 | Stream<T> |
Comparator<T> |
(T, T) -> int |
anyMatch |
终端 | boolean |
Predicate<T> |
T -> boolean |
noneMatch |
终端 | boolean |
Predicate<T> |
T -> boolean |
allMatch |
终端 | boolean |
Predicate<T> |
T -> boolean |
findAny |
终端 | Optional<T> |
||
findFirst |
终端 | Optional<T> |
||
forEach |
终端 | void |
Consumer<T> |
T -> void |
collect |
终端 | R |
Collector<T, A, R> |
|
reduce |
终端 | Optional<T> |
BinaryOperator<T> |
(T, T) -> T |
count |
终端 | long |
新的日期和 API
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 JJLUO の Blog!
评论
匿名评论
你无需删除空行,直接评论以获取最佳展示效果