关于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                     //第三种方式

函数式接口

  1. 函数式接口里只允许一个抽象方法,但是可以添加无数个默认方法。
  2. 可以支持Lambda表达式。
  3. 可以用@FunctionInterface这个注解显示指定这个接口,这样编译器会直接可以检测,如果不符合要求会报错。

方法引用

有几种形式:

Method refrenceDescriptionExample
Reference to static methodUsed to refer static methods from a classMath::max equivalent to Math.max(x,y)
Reference to instance method from instanceRefer to an instance method using a reference to the supplied objectSystem.out::println equivalent to System.out.println(x)
Reference to instance method from class typeInvoke the instance method on a reference to an object supplied by the contextString::length equivalent to str.length()
Reference to constructorReference to a constructorArrayList::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的实例不能序列化,所以在需要用到序列化的地方,不要用。

还有一些新特性,以后会慢慢补充…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值