Java8特性:Optional空值处理

Posted 唐微港

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java8特性:Optional空值处理相关的知识,希望对你有一定的参考价值。

Optional常用方法

  • isPresent()方法当Optional实例的值非空时返回true,否则返回false;
  • orElseGet()方法当Optional包含非空值时返回该值,否则通过接收的function生成一个默认的;

  • map()方法转换当前Optional的值,并返回一个新的Optional实例;

  • orElse()方法与orElseGet方法相似,不同的是orElse()直接返回传入的默认值。

实列

  1. 有值的时候
public static void main(String args[]) {

        Optional<String> fullName = Optional.ofNullable("存放值");
        System.out.println("Full Name is set? " + fullName.isPresent());
        System.out.println("Full Name: " + fullName.orElseGet(() -> "[none]"));
        System.out.println(fullName.map(s -> "Hey " + s + "!").orElse("Hey Stranger!"));
    }
  1. 没有值的时候
public static void main(String args[]) {

        Optional<String> fullName = Optional.ofNullable(null);
        System.out.println("Full Name is set? " + fullName.isPresent());
        System.out.println("Full Name: " + fullName.orElseGet(() -> "[none]"));
        System.out.println(fullName.map(s -> "Hey " + s + "!").orElse("Hey Stranger!"));
    }
  1. get()方法主要用于返回包装对象的实际值,但是如果包装对象值为null,会抛出NoSuchElementException异常
    public T get() {
        if (value == null) {
            throw new NoSuchElementException("No value present");
        }
        return value;
    }
  1. isPresent()方法用于判断包装对象的值是否非空
    public boolean isPresent() {
        return value != null;
    }
  1. ifPresent()方法接受一个Consumer对象(消费函数),如果包装对象的值非空,运行Consumer对象的accept()方法,实列如第二个
    public void ifPresent(Consumer<? super T> consumer) {
        if (value != null)
            consumer.accept(value);
    }
    public static void printName(Student student)
    {
        Optional.ofNullable(student).ifPresent(u ->  System.out.println("The student name is : " + u.getName()));
    }
  1. filter()方法接受参数为Predicate对象,用于对Optional对象进行过滤,如果符合Predicate的条件,返回Optional对象本身,否则返回一个空的Optional对象
    public static void filterAge(Student student)
    {
        Optional.ofNullable(student).filter( u -> u.getAge() > 18).ifPresent(u ->  System.out.println("The student             age is more than 18."));
    }
  1. map()方法的参数为Function(函数式接口)对象,map()方法将Optional中的包装对象用Function函数进行运算,并包装成新的Optional对象(包装对象的类型可能改变)
public static Optional<Integer> getAge(Student student)
    {
        return Optional.ofNullable(student).map(u -> u.getAge()); 
    }
  1. 跟map()方法不同的是,入参Function函数的返回值类型为Optional类型,而不是U类型,这样flatMap()能将一个二维的Optional对象映射成一个一维的对象
    public static Optional<Integer> getAge(Student student)    {        return Optional.ofNullable(student).flatMap(u -> Optional.ofNullable(u.getAge()));     }
  1. orElse()方法功能比较简单,即如果包装对象值非空,返回包装对象值,否则返回入参other的值(默认值)
    public static String getGender(Student student)    {       return Optional.ofNullable(student).map(u -> u.getGender()).orElse("Unkown");            }
  1. orElseGet()方法与orElse()方法类似,区别在于orElseGet()方法的入参为一个Supplier对象,用Supplier对象的get()方法的返回值作为默认值
    public static String getGender(Student student)    {        return Optional.ofNullable(student).map(u -> u.getGender()).orElseGet(() -> "Unkown");          }
  1. orElseThrow()方法其实与orElseGet()方法非常相似了,入参都是Supplier对象,只不过orElseThrow()的Supplier对象必须返回一个Throwable异常
    public static String getGender1(Student student)    {        return Optional.ofNullable(student).map(u -> u.getGender()).orElseThrow(() -> new RuntimeException("Unkown"));          }

orElseThrow()方法适用于包装对象值为空时需要抛出特定异常的场景

Optional避免空指针shili

  1. 不用optional时候
public String getUserSteetName(User user) {    if(null != user) {        Address address = user.getAddress();        if(null != address) {            Street street = address.getStreet();            if(null != street) {                return street.getStreetName();            }        }    }    return "nothing found";}
  1. 使用Optional时候
public String getUserSteetName(User user) {        Optional<User> userOptional = Optional.ofNullable(user);        final String streetName = userOptional.orElse(new User()).getAddress().orElse(new Address()).getStreet().orElse(new Street()).getStreetName();        return StringUtils.isEmpty(streetName) ? "nothing found" : streetName;    }

参考文献

https://www.jianshu.com/p/d81a5f7c9c4e

https://www.cnblogs.com/wuhenzhidu/p/10765655.html

以上是关于Java8特性:Optional空值处理的主要内容,如果未能解决你的问题,请参考以下文章

Java8新特性Optional类在处理空值判断场景的应用 回避空指针异常 编写健壮的应用程序

Java8新特性-官方库新特性

Java8中的新特性Optional

Java - JDK8 新特性 Optional 使用

Java8新特性Optional类

java8新特性→Optional:适用于层级处理非空判断(依赖上一步操作)的场合