一文让你彻底了解java中Optional对象
转自:
http://www.java265.com/JavaCourse/202204/2854.html
下文笔者将详细讲述java中Optional对象,如下所示
Optional对象的功能: 可使用最简化的代码,并高效的处理NPE(Null Pointer Exception空指针异常)
Optional对象的简介
Optional类是java为平时判断对象是否为空时使用
例:
jdk8以前的写法 User user = new User(); if (null == user){ return "user为null"; } jdk8以后可采用以下写法 User user = new User(); return Optional.ofNullable(user).orElse("user为null");
Optional对象创建
// 1、创建一个包装对象值为空的Optional对象 Optional<String> optEmpty = Optional.empty(); // 2、创建包装对象值非空的Optional对象 Optional<String> optOf = Optional.of("optional"); // 3、创建包装对象值允许为空也可以不为空的Optional对象 Optional<String> optOfNullable1 = Optional.ofNullable(null); Optional<String> optOfNullable2 = Optional.ofNullable("optional");
Optional.get()方法(返回对象的值)
get()方法是返回一个option的实例值
public T get() { if (value == null) { throw new NoSuchElementException("No value present"); } return value; } 例: User user = new User(); user.setAge(2); Optional.ofNullable(person).get();
Optional.isPresent()方法(判读是否为空)
isPresent()方法就是会返回一个boolean类型值,如果对象不为空则为真,如果为空则false
public boolean isPresent() { return value != null; } User user = new User(); user.setAge(2); if (Optional.ofNullable(user).isPresent()){ //写不为空的逻辑 System.out.println("不为空"); }else{ //写为空的逻辑 System.out.println("为空"); }
Optional.ifPresent()方法(判读是否为空并返回函数)
如果对象非空,则运行函数体
public void ifPresent(Consumer<? super T> consumer) { //如果value不为空,则运行accept方法体 if (value != null) consumer.accept(value); } 例: User user = new User(); user.setAge(2); Optional.ofNullable(user).ifPresent(p -> System.out.println("年龄"+p.getAge())); 如果对象不为空,则会打印这个年龄,因为内部已经做了NPE(非空判断),所以就不用担心空指针异常了
Optional.filter()方法(过滤对象)
filter()方法大致意思是,接受一个对象,然后对他进行条件过滤,如果条件符合则返回Optional对象本身,如果不符合则返回空Optional
public Optional<T> filter(Predicate<? super T> predicate) { Objects.requireNonNull(predicate); //如果为空直接返回this if (!isPresent()) return this; else //判断返回本身还是空Optional return predicate.test(value) ? this : empty(); } 例: User user = new User(); user.setAge(2); Optional.ofNullable(user).filter(p -> p.getAge()>50);
Optional.map()方法(对象进行二次包装)
map()方法将对应Funcation函数式接口中的对象,进行二次运算,封装成新的对象然后返回在Optional中
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) { Objects.requireNonNull(mapper); //如果为空返回自己 if (!isPresent()) return empty(); else { //否则返回用方法修饰过的Optional return Optional.ofNullable(mapper.apply(value)); } } 例 User user = new User(); user.setAge(2); String optName = Optional.ofNullable(user).map(p -> user.getName()).orElse("name为空");
Optional.flatMap()方法(Optional对象进行二次包装)
map()方法将对应Optional< Funcation >函数式接口中的对象,进行二次运算,封装成新的对象然后返回在Optional中
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)); } } 例 User user = new User(); user.setAge(2); Optional<Object> optName = Optional.ofNullable(user).map(p -> Optional.ofNullable(p.getName()).orElse("name为空"));
Optional.orElse()方法(为空返回对象)
常用方法之一,这个方法意思是如果包装对象为空的话,就执行orElse方法里的value,如果非空,则返回写入对象
public T orElse(T other) { //如果非空,返回value,如果为空,返回other return value != null ? value : other; } 例: User user = new User(); user.setAge(2); Optional.ofNullable(user).orElse(new User("java", 888));
Optional.orElseGet()方法(为空返回Supplier对象)
这个与orElse很相似,入参不一样,入参为Supplier对象,为空返回传入对象的.get()方法,如果非空则返回当前对象
public T orElseGet(Supplier<? extends T> other) { return value != null ? value : other.get(); } 例: Optional<Supplier<User>> sup=Optional.ofNullable(User::new); //调用get()方法,此时才会调用对象的构造方法,即获得到真正对象 Optional.ofNullable(user).orElseGet(sup.get());
Optional.orElseThrow()方法(为空返回异常)
如果为空,就抛出定义的异常
如果不为空返回当前对象
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X { if (value != null) { return value; } else { throw exceptionSupplier.get(); } } 例: User user = userService.selectByPhone(request.getPhone()); Optional.ofNullable(user).orElseThrow(() -> new ServiceException("没有查询的相关数据"));