Java8之Optional用法举例
一、简介
Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
Optional 类的引入很好的解决空指针异常。
二、代码举例
import bean.User; import lombok.extern.slf4j.Slf4j; import org.junit.Test; import java.util.*; @Slf4j public class OptionalDemo { public List<User> getList() { List<User> users = new ArrayList<>(); User user = new User("Tom", 22, "Street #1"); users.add(user); users.add(new User("Michael", 33, "Street #2")); users.add(new User("Lily", 25, "Street #3")); return users; } @Test public void testOptional() { List<User> users = getList(); User user = users.get(0); /*判断是否为空*/ Optional<User> optional = Optional.of(user); log.info("optional.isPresent(): " + optional.isPresent()); /*不确定是否为null*/ User user2 = null; Optional<User> optional2 = Optional.ofNullable(user2); log.info("optional2.isPresent(): " + optional2.isPresent()); /*数据为null时给默认值*/ log.info("optional3.orElse(): " + Optional.ofNullable(user2).orElse(user)); // 通过函数获取默认值,不为空时不执行 // log.info("optional3.orElseGet(): " + Optional.ofNullable(user).orElseGet(createUser())); // 为null时,抛出指定的异常 // log.info("optional3.orElseGet(): " + Optional.ofNullable(user2).orElseThrow(() -> new IllegalArgumentException("数值不能为空!"))); // 对单个值进行处理 users.stream().map(x -> x.getName()).forEach(x -> System.out.println("map:" + x)); // 拆分为多个值分别处理 users.stream().flatMap(x -> Arrays.stream(x.getName().split("o"))).forEach(x -> System.out.println("flatMap:" + x)); } @Test public void testComparator() { List<User> users = getList(); /*查询年龄最大的人*/ Optional<User> max = users.stream().max(Comparator.comparing(User::getAge)); log.info("maxAge: " + max.get().toString()); /*名字最长的人*/ Optional<String> max2 = users.stream().map(u -> u.getName()).max(Comparator.comparing(String::length)); log.info("maxStringLength: " + max2.get()); } }
运行结果:
#testOptional 19:50:34.588 [main] INFO java8.optional.OptionalDemo - optional.isPresent(): true 19:50:34.588 [main] INFO java8.optional.OptionalDemo - optional2.isPresent(): false 19:50:34.588 [main] INFO java8.optional.OptionalDemo - optional3.orElse(): User[name='Tom', age=22, address='Street #1'] map:Tom map:Michael map:Lily flatMap:T flatMap:m flatMap:Michael flatMap:Lily #testComparator 19:50:34.576 [main] INFO java8.optional.OptionalDemo - maxAge: User[name='Michael', age=33, address='Street #2'] 19:50:34.586 [main] INFO java8.optional.OptionalDemo - maxStringLength: Michael