java8 新特性
-
Lambda 表达式 − Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
语法: (parameters) -> expression 或 (parameters) ->{ statements; }
-
方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
List<Long> contractNos = entryDOList.stream().map(EntryDO::getContractNo) .collect(Collectors.toList());
-
默认方法 − 默认方法就是一个在接口里面有了一个实现的方法。
public interface SuperMapper<T> extends BaseMapper<T> { /** * 根据 entity 条件,查询全部记录,返回第一条记录 * @param wrapper * @return */ default T selectFirst(@Param("ew") Wrapper<T> wrapper) { List<T> list = this.selectList(wrapper); return CollectionUtils.isNotEmpty(list) ? list.get(0) : null; } }
-
新工具 − 新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。
-
Stream API −新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。
-
Date Time API − 加强对日期与时间的处理。
LocalDate/LocalTime 和 LocalDateTime 类可以在处理时区不是必须的情况 // 获取当前时间日期区时 ZonedDateTime date1 = ZonedDateTime.parse("2015-12-03T10:15:30+05:30[Asia/Shanghai]");
-
Optional 类 − Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。
import java.util.Optional; public class Java8Tester { public static void main(String args[]){ Java8Tester java8Tester = new Java8Tester(); Integer value1 = null; Integer value2 = new Integer(10); // Optional.ofNullable - 允许传递为 null 参数 Optional<Integer> a = Optional.ofNullable(value1); // Optional.of - 如果传递的参数是 null,抛出异常 NullPointerException Optional<Integer> b = Optional.of(value2); System.out.println(java8Tester.sum(a,b)); } public Integer sum(Optional<Integer> a, Optional<Integer> b){ // Optional.isPresent - 判断值是否存在 System.out.println("第一个参数值存在: " + a.isPresent()); System.out.println("第二个参数值存在: " + b.isPresent()); // Optional.orElse - 如果值存在,返回它,否则返回默认值 Integer value1 = a.orElse(new Integer(0)); //Optional.get - 获取值,值需要存在 Integer value2 = b.get(); return value1 + value2; } } 输出结果 第一个参数值存在: false 第二个参数值存在: true 10
-
Nashorn, JavaScript 引擎 − Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用。
函数式接口
- 有且仅有一个抽象方法
- 可以包含默认的方法
- 可以有静态方法
- java8及以后一般用lambda实现
- java8之前一般用匿名类实现如下
new Comparable<SaveChargeParam>() {
@Override
public int compareTo(SaveChargeParam o) {
return 0;
}
};
stream和parallelStream
stream和parallelStream就是一种流的处理方式,前者是单管,后者是多管道,在性能上用传统的for循环和stream以及parallelStream对list进行遍历,传统方式跟单管道stream的处理效率相差无几,多管道parallelStream的处理效率最高。