1.6 类库新特性
●java.util.stream 类库包新特性
●java.util.Optional 类新特性
●java.util.Base64 类新特性
●Java.time 类新特性
●其它常用类新增特性
●HashMap类性能提升
1.6.1 java.util.stream 类库包新特性
Stream流的特性
定 义:支持数据处理操作的源生成的元素序列。它并非是数据结构,也不是容器,而是一个过程.
引入的原因:1.声明性方式处理数据集合 2.透明地并行处理,提高性能
重要特点:1. 内部迭代 2. 数据流(类似管道)传输
Stream数据类型
Stream流操作的分类:
1.中间操作:可以连接起来的流操作
2.终端操作:关闭流的操作,触发流水线执行并关闭它。
特 点:一个流的操作,没有终端操作 ,则该流中的任何中间操作操作都不会执行。
Stream流的使用:
一个数据源(如源集合)来执行一个操作(如映射).
一个中间操作链(如筛选),形成一条流的流水线.
一个终端操作(如归约),执行流水线,并能生成结果.
流的构建:
Stream流典型的接口方法:
1 filter (Predicate super T> predicate); 用于过滤、筛选 2 distinct(); 去重 [会依赖hasCode和equals]
3 map (Function super T , ? extends R> mapper);
* 对于Stream中包含的元素使用给定的转换函数进行转换操作,把所有的返回值组成新的流。
* 传入User对象(User流),提取里面的所有name属性,转换为一个Strea,的流
* 新生成的Stream只包含转换生成的元素。
Stream 流 - 收集数据:
对流调用 collect 方法将对流中的元素触发归约操作(由 Collector 来参数化), 将流中的元素累计成一个汇总结果。Collectors 实用类提供了许多静态工厂方法,用来创建常见收集器的实例.
Collectors.toList() 返回类型List
Collectors.toSet() 返回类型Set
Collectors.toCollection(Supplier collecttionFactory)返回类型Collection
Collectors.counting()方法返回的收集器,查看集合数量.如:menu.stream().collect(counting());
Collectors.maxBy(Comparator super T> comparator) 根据比较器,获取最大值;
如:userLists.stream().collect(maxBy(Comparator.comparing(User::getAge)));
Collectors.minBy(Comparator super T> comparator) 根据比较器,获取最小值;
Collectors.summingInt/summingDouble/summingLong() 汇总对象映射为求和的int/Double/Long函数;
如:userLists.stream().collect(summingInt(User::getAge));
Collectors.averagingInt/averagingDouble/averagingLong() 汇总对象映射为平均值的int/Double/Long函数;
如:userLists.stream().collect(averagingInt(User::getAge));
Collectors.joining()返回的收集器会把对流中的每一个对象应用toString()后连接成一个字符串,内部使用StringBuilder;重载:参数是分隔符. 如:userLists.stream().map(User::getAge).collect(joining(","));
Stream并行流:
1.6.2 java.util.Optional 类新特性
Optional被定义为一个简单的容器,其值可能是null或者不是null,Java 8之前一般某个函数应该返回非空对象但是偶尔却可能返回了null,而在Java 8 以后,不推荐你返回null而是返回Optional。
java.util.Optional
Optional的优点
1)显式的提醒你需要关注null的情况,对程序员是一种字面上的约束
2)将平时的一些显式的防御性检测给标准化了,并提供一些可串联操作
3)解决null会导致疑惑的概念
Optional对象的创建
empty() 声明一个空的Optional,eg:Optional
of(T value) 为非null的值创建一个Optional.通过工厂方法创建Optional类。创建对象时传入的参数不能为nul,如果为null,则抛出NullPointerException.
ofNullable(T value) 为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional,可以接受参数为null的情况。
常用 方法
isPresent() 如果值存在返回true,否则返回false。
get() 如果Optional有值则将其返回,否则抛出异常 NoSuchElementException。
ifPresent(Consumer super T> consumer) 如果Optional实例有值则为其调用consumer,否则不做处理
orElse(T other) 如果Optional实例有值则将其返回,否则返回orElse方法传入的参数。即参数other为默认返回值,eg:myValue.orElse("传入的参数value!")
orElseGet(Supplier extends T> other) 如果Optional实例有值则将其返回,否则调用other Lambda的get方法返回默认值,eg:myValue.orElseGet(() -> "Default Value")
orElseThrow(Supplier extends X> exceptionSupplier)如果有值则将其返回,否则抛出supplier接口创建的异常。eg:
public static void main(String[] args) {
try { //orElseThrow与orElse方法类似。与返回默认值不同,
//orElseThrow会抛出lambda表达式或方法生成的异常
empty.orElseThrow(ValueAbsentException::new);
} catch (Throwable ex) {
//输出: No value present in the Optional instance
System.out.println(ex.getMessage());
}
}
class ValueAbsentException extends Throwable {
public ValueAbsentException() {super();}
public ValueAbsentException(String msg) {super(msg); }
@Override
public String getMessage() {
return "No value present in the Optional instance";
}
}
map(Function super T,? extends U> mapper) 如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。map方法用来对Optional实例的值执行一系列操作。通过一组实现了Function接口的lambda表达式传入操作。eg:Optional
flatMap(Function super T,Optional> mapper) 如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。flatMap与map(Funtion)方法类似,区别在于flatMap中的mapper返回值必须是Optional。调用结束时,flatMap不会对结果用Optional封装。
filter(Predicate super T> predicate) 如果有值并且满足断言条件返回包含该值的Optional,否则返回空Optional。filter个方法通过传入限定条件对Optional实例的值进行过滤。对于filter函数我们可以传入实现了Predicate接口的lambda表达式。
1.6.3 java.util.Base64 类新特性
Base64已经是 JDK的标准类库,支持Base64的编解码。
1.6.4 Java.time 类新特性
1.6.5 其它常用类新增特性
1.6.6 HashMap类性能提升
1. 7 JAVA虚拟机(JVM)新特性
1. 8 新增工具特性
●jjs 工具:Nashorm 引擎,可以用来解析javascripts脚本
●Jdeps工具:java类的依赖分析工具。
ps:https://www.journaldev.com/2752/java-8-interface-changes-static-method-default-method