关于Java8的一些特性介绍
默认方法
1.java8之后为什么要加入默认方法?
简单的说,是为了适配之前版本,并且支持java8里引进的Lambda表达式。为了支持Lambda表达式,如果接口里的语法之前版本保持一致,我们不得不修改大量的核心代码。例如,ArrayList这个类里有个forEach()方法,是Java8之后引入的,用这个方法,可以很方便的用Java8的语法,一句代码搞定,例如
list.forEach(person -> person.getName());
而不用像之前那样,绑定一个迭代器,调用next(),然后调用hasNext()做判断,等等。好麻烦,有木有。
这个Java8引入默认方法之后,我们可以在接口里添加需要的默认方法,在实例调用的时候,就可以用到。这样,不但jdk的开发人员,就不用修改之前的代码,做到了兼容性。
Lambda表达式
Java8引入的一种表达方式,直接给定输入的参数,执行指定的表达式。好处是使代码看起来简洁,特别是在一些数学计算中。
有以下几种形式:
(parameters) -> expression //第一种方式
(parameters) -> { statements; } //第二种方式
() -> expression //第三种方式
函数式接口
- 函数式接口里只允许一个抽象方法,但是可以添加无数个默认方法。
- 可以支持Lambda表达式。
- 可以用@FunctionInterface这个注解显示指定这个接口,这样编译器会直接可以检测,如果不符合要求会报错。
方法引用
有几种形式:
Method refrence | Description | Example |
---|---|---|
Reference to static method | Used to refer static methods from a class | Math::max equivalent to Math.max(x,y) |
Reference to instance method from instance | Refer to an instance method using a reference to the supplied object | System.out::println equivalent to System.out.println(x) |
Reference to instance method from class type | Invoke the instance method on a reference to an object supplied by the context | String::length equivalent to str.length() |
Reference to constructor | Reference to a constructor | ArrayList::new equivalent to new ArrayList() |
Optional的使用
1.什么是Optional?
简单理解,就是一个容器,这个容器可能包含非空的值,也可能不包非空的值。
2.为什么要用这个容器?
在我们写代码的时候,我们所用的references 会指向一个实例。但是我们经常会忘记初始化,或者在程序运行过程中,reference为null,而我们没有察觉到,这个时候,如果我们没有做非空判断,就用这个reference去调用方法,就会抛出NullPointerException。
Optional设计的目的就是为了减少空指针,可以通过更具表达力的API,更有可读性,可以让开发人员积极地考虑,值在某些情况下可能为null
3.如何用Optional?
Optional<Person> op1 = Optional.of(new Person());
Person p = op.get();
System.out.println(op.isPresent()); //true
Optional<Integer> op2= Optional.empty();
op2.isPresent(); //false
Optional<Person> possible = Optional.of(new Person());
possible.filter(person -> "eason".equals(person.getName()))
.ifPresent(System.out::println);
4.内部工作机制
点进去Optional.java这个类,可以看到Optional中持有的value的定义如下:
/**
* If non-null, the value; if null, indicates no value is present
*/
private final T value;
构造方法私有化
private Optional(T value) {
this.value = Objects.requireNonNull(value);
}
声明EMPTY的实例如下:
/**
* Common instance for {@code empty()}.
*/
private static final Optional<?> EMPTY = new Optional<>();
5.有些不足之处
- 因为Optional的实例不能序列化,所以在需要用到序列化的地方,不要用。
还有一些新特性,以后会慢慢补充…