Optional使用

314 阅读2分钟

前言

在Java开发中,相信一定遇到过不少这样的异常NullPointerException(NPE),没错,即空指针异常,这个异常 在Java程序开发中经常遇见,那么如何有效的避免空指针异常,在程序开发中是免不了的判断,于是JDK8提供了一个语法糖,也就是Optional关键字,Optional是一个用于解决空指针异常的容器,它可以保存类型T的值,或者仅仅保存null,能在开发过程中很好的解决判断是否为空

Optional使用

Optional.of

Optional.of可以传入一个泛型,但是只要时该数据为null,就会抛异常

public class Optional1Demo {

    public static void main(String[] args) {
        String data = "aaa";
        Optional<String> optional = Optional.of(data);
        System.out.println(optional.get());
    }
}

反之

public class Optional2Demo {

    public static void main(String[] args) {
        String data = null;
        Optional<String> optional = Optional.of(data);
        System.out.println(optional.get());
    }
}

会抛空指针异常

image.png

Optional.ofNullable

Optional.of可以传入一个泛型,但是只要时该数据为null,不会抛异常

public class Optional3Demo {

    public static void main(String[] args) {
        String data = null;
        Optional<String> optional = Optional.ofNullable(data);
        System.out.println(optional.get());
    }
}

Optional.empty()

创建一个空的Option

public class Optional4Demo {

    public static void main(String[] args) {
        String data = null;
        Optional<String> optional = Optional.empty();
    }
}

map使用

用于传入一个Function函数

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class User {

    private Long id;

    private String name;
}


public class Optional5Demo {

    public static void main(String[] args) {
        User user = new User(1L, "aaa");
        Optional<String> optional = Optional.ofNullable(user).map(User::getName);
    }
}

ifPresent使用

ifPresent没有返回值,传入的是一个Consumer函数

public class Optional6Demo {

    public static void main(String[] args) {
        User user = new User(1L, "aaa");
        Optional.ofNullable(user).ifPresent(e->{
            System.out.println(user);
        });
    }
}

isPresent使用

isPresent()用于判断Option中的值是否为空

public class Optional7Demo {

    public static void main(String[] args) {
        String data = "aaa";
        Optional<String> optional = Optional.ofNullable(data);
        if (optional.isPresent()) {
            System.out.println(optional.get());
        } else {
            System.out.println("空值");
        }
    }
}

orElse使用

orElse()用于判断如果传入的值是空的,就会返回orElse里面的值

public class Optional8Demo {

    public static void main(String[] args) {
        String data = "aaa";
        String optional = Optional.ofNullable(data).orElse(getData());
        System.out.println(optional);
    }


    public static String getData() {
        System.out.println(12);
        return "aaa";
    }
}

备注:oeElse()里面如果是一个方法的话,会执行一次

orElseGet使用

orElseGet()用于判断如果传入的值是空的,就会返回orElse里面的值

public class Optional9Demo {

    public static void main(String[] args) {
        String data = "aaa";
        String optional = Optional.ofNullable(data).orElseGet(()->{
            System.out.println("hello world");
            return "xxx";
        });
        System.out.println(optional);
    }

}

orElseThrow使用

orElseThrow()用于抛异常处理

public class Optional10Demo {

    public static void main(String[] args) {
        String data = "aaa";
        String optional = Optional.ofNullable(data).orElseThrow();
        System.out.println(optional);
    }

}

ifPresentOrElse

ifPresentOrElse是jdk9版本以上新增的语法,使用如下

public class Optional11Demo {

    public static void main(String[] args) {
        AtomicReference<String> data = new AtomicReference<>("aaa");
        Optional.ofNullable(data).ifPresentOrElse(x -> {
            data.set("asdasd");
            System.out.println(x);
        }, () -> {
            data.set("asdasd");
        });
        System.out.println(data.get());
    }

}

总结

Option可以用于空数据判断,不过判空的方式有很多种,看个人使用和习惯