1.简介
Java 8引入了一个重要的新特性,即Optional类。Optional类是为了解决空指针异常而设计的。
在Java中,当我们尝试访问一个空对象的属性或调用其方法时,很容易抛出NullPointerException。这种异常可能会导致程序崩溃或产生意外结果。
Optional类的目的是提供一种更好的处理空值的方式。它可以包含一个非空的对象,也可以表示一个空值。使用Optional类,我们可以避免直接操作空对象,从而减少NullPointerException的发生。
2.Optional类常用方法
后面的示例代码主要用到map、orElse、ifPresent方法
1.map(Function<? super T,? extends U> mapper):如果Optional对象包含一个非空的值,则将该值应用给定的函数进行转换,并返回一个新的Optional对象,用于存储转换后的结果;否则返回一个空的Optional对象。
2.ofNullable(T value):如果value不为null,则返回一个包含该value的Optional对象;否则返回一个空的Optional对象。
3.isPresent():如果Optional对象包含一个非空的值,则返回true;否则返回false。
4.get():如果Optional对象包含一个非空的值,则返回该值;否则抛出NoSuchElementException异常。
5.orElse(T other):如果Optional对象包含一个非空的值,则返回该值;否则返回other。
6.ifPresent(Consumer<? super T> consumer):如果Optional对象包含一个非空的值,则对该值执行给定的操作;否则不做任何操作。
3.示例代码
我们来看一段代码
public static void main(String[] args) { User user=null; //模拟不确定的空对象 Random random = new Random(); if(random.nextInt(11)>5){ user= new User("Bob"); } //把名字转成小写 user.setName(user.getName().toLowerCase()); System.out.println(user.getName()); }
在这段代码中存在潜在的空指针异常风险。如果随机数小于等于5,则 user 对象为 null,调用 user.getName() 方法会导致空指针异常。
应该在调用 getName() 方法前先进行非空判断。
我们先看传统的手动判空处理
public static void main(String[] args) { User user = null; // 模拟不确定的空对象 Random random = new Random(); if (random.nextInt(11) > 5) { user = new User("Bob"); } // 把名字转成小写 if (user != null && user.getName() != null) { user.setName(user.getName().toLowerCase()); System.out.println(user.getName()); } else { System.out.println("用户对象为空或用户名为空"); } }
相较于这种传统的手动判空方法我们可以使用更优雅的方法Optional
public static void main(String[] args) { User user = null; // 模拟不确定的空对象 Random random = new Random(); if (random.nextInt(11) > 5) { user = new User("Bob"); } // 使用Optional类来包装空对象 //Lambda表达式链式处理写法 Optional<String> optionalS1 = Optional.ofNullable(user).map(u->u.getName()).map(name->name.toLowerCase()); // 输出结果,若空则设置默认值为MiJiu System.out.println(optionalS1.orElse("MiJiu")); //非空则输出结果 optionalS1.ifPresent(s->System.out.println(s)); System.out.println("--------------------------------"); //用方法引用简化 Optional<String> optionalS2 = Optional.ofNullable(user).map(User::getName).map(String::toLowerCase); System.out.println(optionalS2.orElse("MiJiu")); optionalS1.ifPresent(System.out::println); }
有关什么是Lambda表达式可以看这篇
有关什么是方法引用可以看这篇
4.示例代码仓库地址