Java中的Optional使用详细说明
简介
java.util.Optional java1.8 官方描述:
(这是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。)
个人理解: Optional就是相当于把对象包了一层,将判断空的部分代码给单独抽出来了,主要就是为了避免null引起的部分问题.
Optional的使用
首先看看Optional的方法:
三个静态方法
- Optional.empty()
返回一个空的Optional,用的不多;主要就是为了使Optional只存在有值和无值的情况,不存在包含null的情况,在后面的ofNullable方法中使用;
- Optional.of(T value)
public static <T> Optional<T> of(T value) { return new Optional<>(value); } private Optional(T value) { this.value = Objects.requireNonNull(value); } public static <T> T requireNonNull(T obj) { if (obj == null) throw new NullPointerException(); return obj; }
传入一个非null的value值,返回一个包含value的Option;如果为null会抛出空指针异常;
- Optional.ofNullable(T value)(用的最多)
public static <T> Optional<T> ofNullable(T value) { return value == null ? empty() : of(value); }
传入一个非null的value值,返回一个包含value的Option;
传入一个value值,返回一个包含value的Option;可以为null,如果为null则返回一个空的Optional,就是Optional.empty(),可以看看源码
方法介绍
Optional一般链式调用,方法也比较简单
- get()
- 如果该值存在,将该值直接返回,否则抛出一个 NoSuchElementException 异常。
- isPresent()
- 返回该值是否存在的布尔值,存在true不存在false;
- isPresent(Consumer<? super T> consumer)
- 没有返回值,传入的是一个函数,如果存在执行函数,不存在则不执行
- filter(Predicate<? super T> predicate)
- filter 方法接受一个 Predicate 来对 Optional 中包含的值进行过滤,如果包含的值满足条件,那么还是返回这个 Optional;否则返回 Optional.empty。
- map(Function<? super T, ? extends U> mapper)
- 对该值执行提供的 get方法调用。
- flatMap(Function<? super T, Optional> mapper)
- 同上,只不过Function返回的时候就是Optional;而map是代码里面帮忙封装了.
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) { Objects.requireNonNull(mapper); if (!isPresent()) return empty(); else { return Optional.ofNullable(mapper.apply(value)); } } public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) { Objects.requireNonNull(mapper); if (!isPresent()) return empty(); else { return Objects.requireNonNull(mapper.apply(value)); } }
- orElse(T other)
如果调用对象包含值,返回该值,否则返回t。
- orElseGet(Supplier<? extends T> other)
如果调用对象包含值,返回该值,否则返回 other 获取的值。
- orElseThrow(Supplier<? extends X> exceptionSupplier)
如果调用对象包含值,返回该值,否则抛出 other 获取的异常。
使用案例
- 判断对象是否存在,如果存在则执行操作
@Test public void test1() { User user = null; User retUser = new User(); retUser.setName("aaa"); retUser.setAge(33); Optional.ofNullable(retUser).ifPresent(x->{ System.out.println(x.getName()); System.out.println(x.getAge()); }); }
- 判断对象是否为空,如果为空则返回默认值
@Test public void test2() { // User user = new User(); User user = null; User retUser = new User(); retUser.setName("aaa"); retUser.setAge(33); User user1 = Optional.ofNullable(user).orElse(retUser); System.out.println(user1); }
- 对对象的某一属性获取,如果为空则获取默认的,好比返回用户头像地址,如果没有设置则返回一个默认的头像地址,如果有则添加地址返回;
@Test public void test3() { User user = null; User retUser = new User(); retUser.setName("aaa"); retUser.setAge(33); String lowerName = Optional.ofNullable(user).map(u -> { return u.getName(); }).map(name -> { return name.toLowerCase(); }).orElse("默认的名字"); System.out.println(lowerName); }
代码
import lombok.Data; import lombok.ToString; import org.junit.Test; import java.util.Optional; public class OptionalTest { public static void main(String[] args) { User user = new User(); user.setName("yida"); user.setAge(18); Optional<Object> empty = Optional.empty(); Optional<User> user1 = Optional.of(user); Optional<User> user2 = Optional.ofNullable(user); } @Test public void test1() { User user = null; User retUser = new User(); retUser.setName("aaa"); retUser.setAge(33); Optional.ofNullable(retUser).ifPresent(x->{ System.out.println(x.getName()); System.out.println(x.getAge()); }); } @Test public void test2() { User user = null; User retUser = new User(); retUser.setName("aaa"); retUser.setAge(33); User user1 = Optional.ofNullable(user).orElse(retUser); System.out.println(user1); } @Test public void test3() { User user = null; User retUser = new User(); retUser.setName("aaa"); retUser.setAge(33); String lowerName = Optional.ofNullable(user).map(u -> { return u.getName(); }).map(name -> { return name.toLowerCase(); }).orElse("默认的名字"); System.out.println(lowerName); } @Data @ToString private static class User{ private String name; private Integer age; } }
到此这篇关于Java中的Optional使用详细说明的文章就介绍到这了,更多相关Java中的Optional内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Java8通过Function获取字段名的方法(获取实体类的字段名称)
Java8通过Function获取字段名。不用再硬编码,效果类似于mybatis-plus的LambdaQueryWrapper,对Java8通过Function获取字段名相关知识感兴趣的朋友一起看看吧2021-09-09SpringBoot使用mybatis-plus分页查询无效的问题解决
MyBatis-Plus提供了很多便捷的功能,包括分页查询,本文主要介绍了SpringBoot使用mybatis-plus分页查询无效的问题解决,具有一定的参考价值,感兴趣的可以了解一下2023-12-12Java Springboot websocket使用案例详解
这篇文章主要介绍了Java Springboot websocket使用案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下2021-09-09
最新评论