lambda表达式
::方法引用
Stream
新的日期和时间API支持
- LocalDate 日期
- LocalTime 时间
- LocalDateTime 整合
- Instant 时间戳
- Duration 区间
- Periond 区间
- TemporalAdjuster 操作日期、时间函数接口
新增Optional类
Optional它是一个容器对象,可以包含,也可以不包含一个值。Optional中有方法来明确处理值不存在的情况,这样就可以避免NullPointer异常了
变量存在时,Optional类只是对类简单封装。变量不存在时,缺失的值会被建模成一个“空”的Optional对象,由方法Optional.empty()返回
Optional相关API
[外链图片转存失败(img-Cpv6FiOy-1562652059541)(2C5C37BBC8B54CEABAB469E9B987C99A)]
接口中声明静态方法
package defaultmethod;
public interface A {
static void show() {
System.out.println("静态方法");
}
}
接口中声明默认方法
package defaultmethod;
public interface A {
default void show() {
System.out.println("A接口");
}
}
package defaultmethod;
public class Test implements A {
public static void main(String[] args) {
new Test().show();
}
}
默认方法的冲突
一个类继承了多个方法而它们使用的却是同样的函数签名
- 类中的方法优先级最高。类或父类中声明的方法的优先级高于任何声明为默认方法的优先级。
package defaultmethod;
public interface A {
default void show() {
System.out.println("A接口");
}
}
package defaultmethod;
public abstract class D implements A{
public void show() {
System.out.println("类D");
}
}
package defaultmethod;
public class Test extends D implements A {
public static void main(String[] args) {
new Test().show();
// 类D
}
}
- 如果无法依据第一条进行判断,那么子接口的优先级更高:函数签名相同时,优先选择拥有最具体实现的默认方法的接口,即如果B继承了A,那么B就比A更加具体。
// 测试1
package defaultmethod;
public interface A {
default void show() {
System.out.println("A接口");
}
}
package defaultmethod;
public interface B extends A{
default void show() {
System.out.println("接口B");
}
}
package defaultmethod;
public class Test implements A, B {
public static void main(String[] args) {
new Test().show();
// 接口B
}
}
// 测试2
package defaultmethod;
public class Test extends D implements A, B {
public static void main(String[] args) {
new Test().show();
// 接口B
}
}
package defaultmethod;
public abstract class D implements A{
}
- 继承了多个接口的类必须通过显式覆盖和调用期望的方法,显式地选择使用哪一个默认方法的实现。
package defaultmethod;
public interface A {
default void show() {
System.out.println("A接口");
}
}
package defaultmethod;
public interface B {
default void show() {
System.out.println("接口B");
}
}
package defaultmethod;
public class Test implements A, B {
public static void main(String[] args) {
new Test().show();
}
@Override
public void show() {
A.super.show();
}
}