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; }}
结果:
- 1.2 如果一个值确定不为空的情况下,可以使用Optional类中的of方法来把数据封装到Optional类(有bug,可以传个空试试)
Optional<Object> o = Optional.of(null); System.out.println(o);
结果:
- 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(); }
结果:
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); }
结果:输出“慕言”两字