开发者

Java中的Optional使用详细说明

目录
  • 简介
  • Optional的使用
    • 方法介绍
  • 使用案例

    简介

    Java.util.Optional java1.8 官方描述:

    (这是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。)

    个人理解: Optional就是相当于把对象包了一层,将判断空的部分代码给单独抽出来了,主要就是为了避免null引起的部分问题.

    Optional的使用

    首先看看Optional的方法:

    Java中的Optional使用详细说明

    三个静态方法

    • Optional.empty()

    返回一个空的Optional,用的不多;主要就是为了使Optional只存在有值和无值的情况,不存在包含null的情况php,在后面的ofNullable方法中使用;

    • Optional.of(T value)
     
       public static <T> Optional<T> of(T value) {
            return new Optional<>(value);
        }
        
       private Optional(T value) {
            this.value = Objec编程客栈ts.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(Suppliejsr<? 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");
    python        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内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜