一、lambda表达式
- lambda表达式是一个函数的简洁书写方式
- lambda表达式可以作为参数传递给方法或存储在变量中
- lambda表达式使代码更简洁明了
二、函数式接口
- 函数式接口,就是有且仅有一个抽象方法的接口
- 函数式接口,可加上注解 @FunctionalInterface
- 函数式接口,是为了更好的使用lambda表达式而产生的概念
三、方法引用
- 方法引用是lambda表达式的一种更简洁的写法
- 当lambda表达式中,只涉及单一方法的调用时,就可以使用方法引用
- 方法引用使代码进一步简洁明了
四、默认方法与默认静态方法
- 默认方法,就是在接口中有方法体,并由default修饰的方法
- 默认静态方法,就是在接口中有方法体,并由static修饰的方法
- 接口中可以有多个默认方法和默认静态方法
- 为什么?为了解决接口的修改与现有的实现不兼容的问题
注意:默认静态方法,只能接口名.方法名使用!
五、Stream API
- Stream(流)是从支持数据处理操作的源生成的元素序列
- Stream API允许以声明性方式处理数据集合
- Stream API配合lambda表达式使用,使数据处理高效率、干净、简洁
- Stream 不是数据结构,它是数据的处理的平台
筛选和切片
- filter:过虑
- distinct:去重
- limit:截断
- skip:跳过(limit(n)与skip(n)是互补的)
映射
- map
查找和匹配
- allMatch:所有匹配则返回true
- anyMatch:任意一个匹配则返true
- noneMacth:没有一个匹配则返回true
- findFirst:查找第一个
- findAny:查找任一个
归约
- 元素求和:int sum = numbers.stream().reduce(0, (a, b) -> a + b);
- 最大值:Optional max = numbers.stream().reduce(Integer::max);
- 最小值:Optional max = numbers.stream().reduce(Integer::min);
收集
- 分组:Map<Dish.Type, List> dishesByType = menu.stream().collect(groupingBy(Dish::getType));
- 分区:特殊的分组,true一组,false一组
六、Optional 类
- Optional 是一个容器类,存放一个T类型的对象或null
- OPtional 容器内存值,则isPresent()方法返回true,调用get()则返回该值
- Optional 类的引入很好的解决空指针异常,避免源码被各种null检查污染,以便开发者写出更加整洁的代码
Optional<String> fullName = Optional.ofNullable(null);
System.out.println("Full Name is set? " + fullName.isPresent());
System.out.println("Full Name: " + fullName.orElseGet(() -> "[none]"));
System.out.println(fullName.map(s -> "Hey " + s + "!").orElse("Hey Stranger!"));
Full Name is set? false
Full Name: [none]
Hey Stranger!
七、新的日期时间 API
- 它提供了javax.time.ZoneId用来处理时区
- 它提供了LocalDate、LocalTime、Clock、Instant、DateTimeFormatter等类
- Java 8中新的时间与日期API中的所有类都是不可变且线程安全的,这与之前的Date与Calendar API中的恰好相反,那里面像java.util.Date以及SimpleDateFormat这些关键的类都不是线程安全的
- 新的API对日期时间的使用和各种计算更简洁明了
八、Base64
- 在Java 8中,Base64编码已经成为Java类库的标准。
- Java 8 内置了 Base64 编码的编码器和解码器。
- Base64工具类提供了一套静态方法获取三种BASE64编解码器:基本、URL、MIME
九、Nashorn, JavaScript 引擎
- Nashorn 一个 javascript 引擎。
- 从JDK 1.8开始,Nashorn取代Rhino(JDK 1.6, JDK1.7)成为Java的嵌入式JavaScript引擎。Nashorn完全支持ECMAScript 5.1规范以及一些扩展。它使用基于JSR 292的新语言特性,其中包含在JDK 7中引入的 invokedynamic,将JavaScript编译成Java字节码。
- 与先前的Rhino实现相比,这带来了2到10倍的性能提升
- java与js代码可以在其中互相调用