java8常用新特性
1、Lambda 表达式
1 | // 1. 不需要参数,返回值为 5 |
2、函数式接口
函数接口是只有一个抽象方法的接口,用作 Lambda 表达式的类型。使用@FunctionalInterface注解修饰的类,编译器会检测该类是否只有一个抽象方法或接口,否则,会报错。可以有多个默认方法,静态方法。
函数接口 | 抽象接口 | 功能 | 参数 | 返回类型 |
---|---|---|---|---|
Predicate | test(T t) | 判断真假 | T | boolean |
Consumer | accept(T t) | 消费消息 | T | void |
Function | R apply(T t) | 将T映射为R | T | R |
Supplier | T get() | 生产消息 | None | T |
UnaryOperator | T apply(T t) | 一元操作 | T | T |
BinaryOperator | apply(T t,U u) | 二元操作 | (T,U) | T |
常用的方法举例
1 |
|
另一种使用就是可以消除大量if-else,给代码解耦合,这里我简单贴部分demo
1 | // 里面可以分几个类,这里我全写在一起了 |
3、Stream流式编程
Stream(流)是一个来自数据源的元素队列并支持聚合操作
- 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
- 数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
- 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。
1. collect(Collectors.toList())
将流转换为list。还有toSet(),toMap()等。及早求值。
1 |
|
2. forEach
Stream 提供了新的方法 forEach
来迭代流中的每个数据
1 |
|
3. filter
过滤筛选的作用。内部就是Predicate接口。惰性求值。
1 |
|
3. map
转换功能,内部就是Function接口。惰性求值
1 |
|
5. flatMap
将多个Stream合并为一个Stream。惰性求值
1 |
|
6. max和min
集合中求最大值和最小值,及早求值。maxBy或者minBy就是求最大值与最小值。
1 |
|
7. count
统计功能,一般都是结合filter使用,因为先筛选出我们需要的再统计即可。及早求值
1 |
|
8. reduce
reduce 操作可以实现从一组值中生成一个值
1 |
|
9. collect高级用法
1 | //将分成true和false两个集合 |
4、Optional类
Optional 类是一个可以为null的容器对象。目的是为了解决空指针异常。
1. empty()
返回一个Optional
容器对象,而不是 null。建议常用⭐⭐⭐⭐
2. get()
如果创建的Optional中有值存在,则返回此值,否则抛出NoSuchElementException
。在判空之前,千万不要直接使用!尽量别用!⭐
1 | //会报错java.util.NoSuchElementException: No value present |
3. of(T value)
创建一个Optional
对象,如果 value 是 null,则抛出 NPE。不建议用⭐⭐
4. ofNullable(T value)
同上,创建一个Optional
对象,但 value 为空时返回Optional.empty()
。推荐使用⭐⭐⭐⭐⭐
1 |
|
5. orElse(T other)
同样是返回Optional
中包装的值,但不同的是当取不到值时,返回你指定的 default。可以用⭐⭐⭐
6. orElseGet(Supplier<? extends T> other)
如果创建的Optional中有值存在,则返回此值,否则返回一个由Supplier接口生成的值。推荐使用⭐⭐⭐⭐⭐
1 | private User createNewUser() { |
7. orElseThrow(Supplier<? extends X> exceptionSupplier)
如果创建的Optional中有值存在,则返回此值,否则抛出一个由指定的Supplier接口生成的异常。阻塞性业务场景推荐使用⭐⭐⭐⭐
1 |
|
8. isPresent()
如果创建的Optional中的值存在,返回true,否则返回false。在某些情况下很有用,但尽量不要用在 if 判断体中。可以用⭐⭐⭐
9. ifPresent(Consumer<? super T> consumer)
判断Optional
中是否有值,有值则执行 consumer,否则什么都不干。日常情况下请使用这个⭐⭐⭐⭐
10. filter(Predicate<? super T> predicate)
如果创建的Optional中的值满足filter中的条件,则返回包含该值的Optional对象,否则返回一个空的Optional对象
11. map
如果创建的Optional中的值存在,对该值执行提供的Function函数调用
1 |
|
12. flagMap
如果创建的Optional中的值存在,就对该值执行提供的Function函数调用,返回一个Optional类型的值,否则就返回一个空的Optional对象,其返回的值是解除包装的值
1 | //该方法在User类中定义 |
13. filter
filter() 接受一个 Predicate 参数,返回测试结果为 true 的值。如果测试结果为 false,会返回一个空的 Optional。
1 |
|
14. 其他
Java 9 为 Optional 类添加了三个方法:or()、ifPresentOrElse() 和 stream()。or() 方法与 orElse() 和 orElseGet() 类似,它们都在对象为空的时候提供了替代情况。or() 的返回值是由 Supplier 参数产生的另一个 Optional 对象。
5、Base64
Base64工具类提供了一套静态方法获取下面三种BASE64编解码器:
- **基本:**输出被映射到一组字符A-Za-z0-9+/,编码不添加任何行标,输出的解码仅支持A-Za-z0-9+/。
- **URL:**输出映射到一组字符A-Za-z0-9+_,输出是URL和文件。
- **MIME:**输出隐射到MIME友好格式。输出每行不超过76字符,并且使用’\r’并跟随’\n’作为分割。编码输出最后没有行分割。
1 |
|
6、Java 8 日期时间
新的java.time包涵盖了所有处理日期,时间,日期/时间,时区,时刻(instants),过程(during)与时钟(clock)的操作。
1 |
|
参考文章:
https://www.matools.com/api/java8