> 文档中心 > Optional的详细使用

Optional的详细使用

文章目录

  • 一、使用
      • 1.创建对象
      • 2.安全消费
      • 3.安全获取值
      • 4.过滤
      • 5.判断

一、使用

1.创建对象

  • 1.1 Optional类似是包装类,可以把具体的数据封装在其中,然后使用里面封装好的方法可以有效防止空指针
    一般通过Optional类中的ofNullable方法来把数据封装到Optional类
public class Test03 {    public static void main(String[] args) { Author author = author(); Optional<Author> author1 = Optional.ofNullable(author); author1.ifPresent(author2 -> System.out.println(author2.getName())); author1.ifPresent(author2 -> System.out.println(author2.getAge())); System.out.println(author1);    }    public static Author author(){ Author author = new Author(1,"峰哥",25); return author;    }}

结果
Optional的详细使用

  • 1.2 如果一个值确定不为空的情况下,可以使用Optional类中的of方法来把数据封装到Optional类(有bug,可以传个空试试)
Optional<Object> o = Optional.of(null); System.out.println(o);

结果:
Optional的详细使用

  • 1.3 当判断发现某个计算返回值为null时,需要把null值封装成Optional对象返回,可以采用Optional类中的empty方法
 public static Optional<Author> getAuthor(){ Author author = new Author(1,"峰哥",25); return author==null?Optional.empty():Optional.of(author);    }     Optional<Author> author2 = getAuthor();     author2.ifPresent(s-> System.out.println(s.getName()));

结果:输出“峰哥”两字

2.安全消费

当获到一个Optional对象后需要对其中进行操作,可以通过Optional类中的ifPresent方法来消费其中的值

3.安全获取值

如果期望安全获取值,不推荐使用get,而是使用Optional提供的方法

  • 3.1 orElseGet
    获取数据并且设置数据为空的默认值,如果不为空则获取其中的数据,如果为空则获取设置的默认数据
 public static Optional<Author> getAuthor1(){ Author author = new Author(1,"慕言",25); return Optional.ofNullable(author);    }    Optional<Author> author1 = getAuthor1(); Author author = author1.orElseGet(() -> new Author()); System.out.println(author.getName());

结果:输出“慕言”两字

  • 3.2 orElseThrow
    获取数据,如果不为空则获取其中的数据,如果为空则根据传入的数据来创建异常的抛出
 public static Optional<Author> getAuthor1(){ Author author = new Author(1,"慕言",25); return Optional.ofNullable(author);    }     Optional<Author> author1 = getAuthor1(); try {     Author author = author1.orElseThrow( () -> new RuntimeException("数据为空"));     System.out.println(author); } catch (Throwable throwable) {     throwable.printStackTrace(); }

结果:
Optional的详细使用

4.过滤

可以通过filter方法对数据进行过滤,如果原本有数据,但不满足判断的,则会变成一个无数据的Optional对象

 public static void main(String[] args) {  testFilter();  }  private static void testFilter() { Optional<Author> author1 = getAuthor1(); author1.filter(author -> author.getAge() > 18).ifPresent(author -> System.out.println(author.getName()));    }    public static Optional<Author> getAuthor1(){ Author author = new Author(1,"慕言",25); return Optional.ofNullable(author);    }

结果:输出“慕言”两字

5.判断

可以通过isPresent判断数据是否存在

public static void main(String[] args) {  testFilter();  }  private static void testFilter() { Optional<Author> author1 = getAuthor1(); if (author1.isPresent()) {     System.out.println(author1.get().getName()); }  public static Optional<Author> getAuthor1(){ Author author = new Author(1,"慕言",25); return Optional.ofNullable(author);    }

结果:输出“慕言”两字