优雅地使用Optional

Optional在java8中的另一个热门API,为开发者解决的痛点是:NullPointException 问题

  1. 构造方法

    1. Optional.of(Object object):入参object不能为空,否则会抛出空指针异常
    2. Optional.ofNullable(Object object):入参object可以为空,如果object不为空,就创建一个Optional实例;如果object为空就返回一个static fainal的Option对象,注意这里不会新建Option实例,而是使用一个static final的实例EMPTY
    3. Optional.empty():就是上面分析Optional.ofNullable的时候用到的empty方法,直接返回一个static final的实例EMPTY;
  2. 常用函数列表:
    ifPresent:T值如果不为空,将一个Lambda表达式作为输入。
    orElse:如果在T可能空时你需要一个值的话,那么可以使用 orElse(),它能在T值存在的情况下返回这个值,否则返回输入值。
    orElseGet: 方法类似于orElse(),但是不是直接返回输入参数,而是调用输入参数,返回调用的结果,这个输入参数通常是lambda。
    orElseThrow:是在当遭遇Null时,决定抛出哪个Exception时使用。
    map:能够返回另外一个(处理后的)Optional。
    get:如果在这个Optional中包含这个值,返回值,否则抛出异常:NoSuchElementException。

    示例代码如下:

package com.java8.optional;

/**
 * Description: <br>
 *
 * @author: name:yuxin <br>email: yuruixin@ixincheng.com <br>
 * Create Time:  2018/3/31 0031-下午 5:39<br>
 */
public class Person {

    private int id;

    private int age;

    private String name;

    public Person(int id, int age, String name) {
        this.id = id;
        this.age = age;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
package com.java8.optional;

import java.util.Optional;

/**
 * Description: <br>
 *
 * @author: name:yuxin <br>email: yuruixin@ixincheng.com <br>
 * Create Time:  2018/3/31 0031-下午 5:40<br>
 */
public class PersonService {

    private static final Person DEFAULT = new Person(1,18,"jack");

    public Person queryById(int id){
        return null;
    }

    public Person getPersonBeforeJava8(int id){
        Person person = queryById(id);
        return person==null?DEFAULT:person;
    }

    public Person getPsersonAfterJava8(int id){
        Optional<Person> person = Optional.ofNullable(queryById(id));
        return person.orElse(DEFAULT);
    }

    public Person getPsersonAfterJava8OrElseGet(int id){
        Optional<Person> person = Optional.ofNullable(queryById(id));
        return person.orElseGet(()->new Person(1,28,"yuxin"));
    }

    public static void java8OptionalMap(){
        Stream<Person> persons = Stream.of(new Person(1,18,"jack"),new Person(2,28,"yuxin"));
        Optional<Person> p = persons
                .filter(person -> person.getName().startsWith("yu"))
                .findFirst();
//        p.ifPresent((pp)->System.out.println(pp.getName()));
        Optional<String> s = p.map((ppp) -> ppp.getName());
        System.out.println(s.get());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值