精华内容
下载资源
问答
  • Java Optional

    2021-04-11 20:13:05
    Java Optional1 OptionalPlus.java2 测试3 结果 1 OptionalPlus.java package com.xu.builder; public class OptionalPlus<T> { private final T value; private OptionalPlus() { this.value = null; ...

    00 Java 版本

    System.out.println(System.getProperty("java.version"));
    
    15.0.2
    

    01 empty()

    Optional<Student> optional = Optional.empty();
    System.out.println(optional);
    
    D:\Java\jdk-15.0.2\bin\java.exe "-javaagent:D:\IDE\IntelliJ IDEA 2020.3.1\lib\idea_rt.jar=8714:D:\IDE\IntelliJ IDEA 2020.3.1\bin" -Dfile.encoding=UTF-8 -classpath E:\SourceCode\Idea-2020.2\JavaProject\target\classes;D:\Learn\OpenCV-4.5.1\build\java\opencv-451.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\mp3spi\1.9.5.4\mp3spi-1.9.5.4.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\jlayer\1.0.1.4\jlayer-1.0.1.4.jar;E:\JAVA\Maven\repository\junit\junit\3.8.2\junit-3.8.2.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\tritonus-share\0.3.7.4\tritonus-share-0.3.7.4.jar;E:\JAVA\Maven\repository\org\jflac\jflac-codec\1.5.2\jflac-codec-1.5.2.jar;E:\JAVA\Maven\repository\org\jaudiotagger\2.0.3\jaudiotagger-2.0.3.jar com.xu.builder.Test
    Optional.empty
    

    02 static of(T)

    of() 和 ofNullable() 类似,都可以用来创建Optional,不同的是如果参数为null of()方法会报错,而ofNullable()则不会报错。

    方法返回值
    public static <T> Optional<T> of(T value)Optional<T>
    public static <T> Optional<T> ofNullable(T value)Optional<T>
    package com.xu.builder;
    
    import java.util.Optional;
    import java.util.UUID;
    
    /**
     * All rights Reserved, Designed By Hyacinth
     *
     * @version V1.0
     * @Title: Test.java
     * @Package com.xu.test
     * @Description:
     * @author: hyacinth
     * @date: 2021年4月5日 下午7:58:37
     * @Copyright:
     */
    public class Test {
    
        public static void main(String[] args) {
            Student student = Builder.of(Student::new)
                    .width(Student::setId, UUID.randomUUID().toString())
                    .width(Student::setName, "张三")
                    .width(Student::setAge, 21)
                    .build();
            Optional<Student> optional = Optional.of(student); // 如果 student == null 会报错
            String name = optional.map(Student::getName).get();
            System.out.println(name);
        }
        
    }
    
    D:\Java\jdk-15.0.2\bin\java.exe "-javaagent:D:\IDE\IntelliJ IDEA 2020.3.1\lib\idea_rt.jar=8714:D:\IDE\IntelliJ IDEA 2020.3.1\bin" -Dfile.encoding=UTF-8 -classpath E:\SourceCode\Idea-2020.2\JavaProject\target\classes;D:\Learn\OpenCV-4.5.1\build\java\opencv-451.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\mp3spi\1.9.5.4\mp3spi-1.9.5.4.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\jlayer\1.0.1.4\jlayer-1.0.1.4.jar;E:\JAVA\Maven\repository\junit\junit\3.8.2\junit-3.8.2.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\tritonus-share\0.3.7.4\tritonus-share-0.3.7.4.jar;E:\JAVA\Maven\repository\org\jflac\jflac-codec\1.5.2\jflac-codec-1.5.2.jar;E:\JAVA\Maven\repository\org\jaudiotagger\2.0.3\jaudiotagger-2.0.3.jar com.xu.builder.Test
    张三
    

    03 static ofNullable(T)

    package com.xu.builder;
    
    import java.util.Optional;
    import java.util.UUID;
    
    /**
     * All rights Reserved, Designed By Hyacinth
     *
     * @version V1.0
     * @Title: Test.java
     * @Package com.xu.test
     * @Description:
     * @author: hyacinth
     * @date: 2021年4月5日 下午7:58:37
     * @Copyright:
     */
    public class Test {
    
        public static void main(String[] args) {
            Student student = Builder.of(Student::new)
                    .width(Student::setId, UUID.randomUUID().toString())
                    .width(Student::setName, "张三")
                    .width(Student::setAge, 21)
                    .build();
            Optional<Student> optional = Optional.ofNullable(student); // 如果 student == null 也不会报错
            String name = optional.map(Student::getName).get();
            System.out.println(name);
        }
        
    }
    
    D:\Java\jdk-15.0.2\bin\java.exe "-javaagent:D:\IDE\IntelliJ IDEA 2020.3.1\lib\idea_rt.jar=8714:D:\IDE\IntelliJ IDEA 2020.3.1\bin" -Dfile.encoding=UTF-8 -classpath E:\SourceCode\Idea-2020.2\JavaProject\target\classes;D:\Learn\OpenCV-4.5.1\build\java\opencv-451.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\mp3spi\1.9.5.4\mp3spi-1.9.5.4.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\jlayer\1.0.1.4\jlayer-1.0.1.4.jar;E:\JAVA\Maven\repository\junit\junit\3.8.2\junit-3.8.2.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\tritonus-share\0.3.7.4\tritonus-share-0.3.7.4.jar;E:\JAVA\Maven\repository\org\jflac\jflac-codec\1.5.2\jflac-codec-1.5.2.jar;E:\JAVA\Maven\repository\org\jaudiotagger\2.0.3\jaudiotagger-2.0.3.jar com.xu.builder.Test
    张三
    

    04 equals(Object)

    Optional<Student> optional1 = Optional.of(student);
    Optional<Student> optional2 = Optional.ofNullable(null);
    System.out.println(optional1.equals(optional2));
    
    D:\Java\jdk-15.0.2\bin\java.exe "-javaagent:D:\IDE\IntelliJ IDEA 2020.3.1\lib\idea_rt.jar=8714:D:\IDE\IntelliJ IDEA 2020.3.1\bin" -Dfile.encoding=UTF-8 -classpath E:\SourceCode\Idea-2020.2\JavaProject\target\classes;D:\Learn\OpenCV-4.5.1\build\java\opencv-451.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\mp3spi\1.9.5.4\mp3spi-1.9.5.4.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\jlayer\1.0.1.4\jlayer-1.0.1.4.jar;E:\JAVA\Maven\repository\junit\junit\3.8.2\junit-3.8.2.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\tritonus-share\0.3.7.4\tritonus-share-0.3.7.4.jar;E:\JAVA\Maven\repository\org\jflac\jflac-codec\1.5.2\jflac-codec-1.5.2.jar;E:\JAVA\Maven\repository\org\jaudiotagger\2.0.3\jaudiotagger-2.0.3.jar com.xu.builder.Test
    张三
    

    05 filter(Predicate<? super T>)

    package com.xu.builder;
    
    import java.util.Optional;
    import java.util.UUID;
    
    /**
     * All rights Reserved, Designed By Hyacinth
     *
     * @version V1.0
     * @Title: Test.java
     * @Package com.xu.test
     * @Description:
     * @author: hyacinth
     * @date: 2021年4月5日 下午7:58:37
     * @Copyright:
     */
    public class Test {
    
        public static void main(String[] args) {
            Student student = Builder.of(Student::new)
                    .width(Student::setId, UUID.randomUUID().toString())
                    .width(Student::setName, "张三")
                    .width(Student::setAge, 21)
                    .build();
            Optional<Student> optional = Optional.of(student).filter(e -> e.getAge() == 21);
            String name = optional.map(Student::getName).get();
            System.out.println(name);
        }
        
    }
    
    D:\Java\jdk-15.0.2\bin\java.exe "-javaagent:D:\IDE\IntelliJ IDEA 2020.3.1\lib\idea_rt.jar=8714:D:\IDE\IntelliJ IDEA 2020.3.1\bin" -Dfile.encoding=UTF-8 -classpath E:\SourceCode\Idea-2020.2\JavaProject\target\classes;D:\Learn\OpenCV-4.5.1\build\java\opencv-451.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\mp3spi\1.9.5.4\mp3spi-1.9.5.4.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\jlayer\1.0.1.4\jlayer-1.0.1.4.jar;E:\JAVA\Maven\repository\junit\junit\3.8.2\junit-3.8.2.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\tritonus-share\0.3.7.4\tritonus-share-0.3.7.4.jar;E:\JAVA\Maven\repository\org\jflac\jflac-codec\1.5.2\jflac-codec-1.5.2.jar;E:\JAVA\Maven\repository\org\jaudiotagger\2.0.3\jaudiotagger-2.0.3.jar com.xu.builder.Test
    张三
    

    06 flatMap(Function<? super T, ? extends Optional<? extends U>>)

    07 get()

    Optional<Student> optional = Optional.of(student).filter(e -> e.getAge() == 21);
    String name = optional.map(Student::getName).get();
    System.out.println(name);
    
    D:\Java\jdk-15.0.2\bin\java.exe "-javaagent:D:\IDE\IntelliJ IDEA 2020.3.1\lib\idea_rt.jar=8714:D:\IDE\IntelliJ IDEA 2020.3.1\bin" -Dfile.encoding=UTF-8 -classpath E:\SourceCode\Idea-2020.2\JavaProject\target\classes;D:\Learn\OpenCV-4.5.1\build\java\opencv-451.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\mp3spi\1.9.5.4\mp3spi-1.9.5.4.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\jlayer\1.0.1.4\jlayer-1.0.1.4.jar;E:\JAVA\Maven\repository\junit\junit\3.8.2\junit-3.8.2.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\tritonus-share\0.3.7.4\tritonus-share-0.3.7.4.jar;E:\JAVA\Maven\repository\org\jflac\jflac-codec\1.5.2\jflac-codec-1.5.2.jar;E:\JAVA\Maven\repository\org\jaudiotagger\2.0.3\jaudiotagger-2.0.3.jar com.xu.builder.Test
    张三
    

    08 hashCode()

    Optional<Student> optional = Optional.of(student).filter(e -> e.getAge() == 21);
    System.out.println(optional.hashCode());
    
    D:\Java\jdk-15.0.2\bin\java.exe "-javaagent:D:\IDE\IntelliJ IDEA 2020.3.1\lib\idea_rt.jar=8799:D:\IDE\IntelliJ IDEA 2020.3.1\bin" -Dfile.encoding=UTF-8 -classpath E:\SourceCode\Idea-2020.2\JavaProject\target\classes;D:\Learn\OpenCV-4.5.1\build\java\opencv-451.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\mp3spi\1.9.5.4\mp3spi-1.9.5.4.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\jlayer\1.0.1.4\jlayer-1.0.1.4.jar;E:\JAVA\Maven\repository\junit\junit\3.8.2\junit-3.8.2.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\tritonus-share\0.3.7.4\tritonus-share-0.3.7.4.jar;E:\JAVA\Maven\repository\org\jflac\jflac-codec\1.5.2\jflac-codec-1.5.2.jar;E:\JAVA\Maven\repository\org\jaudiotagger\2.0.3\jaudiotagger-2.0.3.jar com.xu.builder.Test
    1972439101
    

    09 ifPresent(Consumer<? super T>)

    package com.xu.builder;
    
    import java.util.Optional;
    import java.util.UUID;
    import java.util.concurrent.atomic.AtomicReference;
    
    /**
     * All rights Reserved, Designed By Hyacinth
     *
     * @version V1.0
     * @Title: Test.java
     * @Package com.xu.test
     * @Description:
     * @author: hyacinth
     * @date: 2021年4月5日 下午7:58:37
     * @Copyright:
     */
    public class Test {
    
        public static void main(String[] args) {
            Student student = Builder.of(Student::new)
                    .width(Student::setId, UUID.randomUUID().toString())
                    .width(Student::setName, "张三")
                    .width(Student::setAge, 21)
                    .build();
            Optional.ofNullable(student).ifPresent(e -> {
                System.out.println(e);
            });
            AtomicReference<String> name = new AtomicReference<>("");
            Optional.ofNullable(student).ifPresent(e -> {
                name.set(e.getName());
            });
            System.out.println(name.get());
        }
        
    }
    
    D:\Java\jdk-15.0.2\bin\java.exe "-javaagent:D:\IDE\IntelliJ IDEA 2020.3.1\lib\idea_rt.jar=9013:D:\IDE\IntelliJ IDEA 2020.3.1\bin" -Dfile.encoding=UTF-8 -classpath E:\SourceCode\Idea-2020.2\JavaProject\target\classes;D:\Learn\OpenCV-4.5.1\build\java\opencv-451.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\mp3spi\1.9.5.4\mp3spi-1.9.5.4.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\jlayer\1.0.1.4\jlayer-1.0.1.4.jar;E:\JAVA\Maven\repository\junit\junit\3.8.2\junit-3.8.2.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\tritonus-share\0.3.7.4\tritonus-share-0.3.7.4.jar;E:\JAVA\Maven\repository\org\jflac\jflac-codec\1.5.2\jflac-codec-1.5.2.jar;E:\JAVA\Maven\repository\org\jaudiotagger\2.0.3\jaudiotagger-2.0.3.jar com.xu.builder.Test
    Student [age=21, id=5d59e721-3f97-416a-9b15-274203a5cb13, name=张三, email=null]
    张三
    
    Process finished with exit code 0
    

    10 ifPresentOrElse(Consumer<? super T>, Runnable)

    package com.xu.builder;
    
    import java.util.Optional;
    import java.util.UUID;
    import java.util.concurrent.atomic.AtomicReference;
    
    /**
     * All rights Reserved, Designed By Hyacinth
     *
     * @version V1.0
     * @Title: Test.java
     * @Package com.xu.test
     * @Description:
     * @author: hyacinth
     * @date: 2021年4月5日 下午7:58:37
     * @Copyright:
     */
    public class Test {
    
        public static void main(String[] args) {
            Student student = Builder.of(Student::new)
                    .width(Student::setId, UUID.randomUUID().toString())
                    .width(Student::setName, "张三")
                    .width(Student::setAge, 21)
                    .build();
            Optional.ofNullable(student).ifPresentOrElse(e -> {
                System.out.println(e);
            }, () -> {
                System.out.println("null");
            });
            AtomicReference<String> name = new AtomicReference<>("");
            Optional.ofNullable(student).ifPresentOrElse(e -> {
                name.set(e.getName());
            }, () -> {
                throw new RuntimeException("null");
            });
            System.out.println(name.get());
        }
        
    }
    
    D:\Java\jdk-15.0.2\bin\java.exe "-javaagent:D:\IDE\IntelliJ IDEA 2020.3.1\lib\idea_rt.jar=9013:D:\IDE\IntelliJ IDEA 2020.3.1\bin" -Dfile.encoding=UTF-8 -classpath E:\SourceCode\Idea-2020.2\JavaProject\target\classes;D:\Learn\OpenCV-4.5.1\build\java\opencv-451.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\mp3spi\1.9.5.4\mp3spi-1.9.5.4.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\jlayer\1.0.1.4\jlayer-1.0.1.4.jar;E:\JAVA\Maven\repository\junit\junit\3.8.2\junit-3.8.2.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\tritonus-share\0.3.7.4\tritonus-share-0.3.7.4.jar;E:\JAVA\Maven\repository\org\jflac\jflac-codec\1.5.2\jflac-codec-1.5.2.jar;E:\JAVA\Maven\repository\org\jaudiotagger\2.0.3\jaudiotagger-2.0.3.jar com.xu.builder.Test
    Student [age=21, id=5d59e721-3f97-416a-9b15-274203a5cb13, name=张三, email=null]
    张三
    
    Process finished with exit code 0
    

    11 isEmpty()

    package com.xu.builder;
    
    import java.util.Optional;
    import java.util.UUID;
    import java.util.concurrent.atomic.AtomicReference;
    
    /**
     * All rights Reserved, Designed By Hyacinth
     *
     * @version V1.0
     * @Title: Test.java
     * @Package com.xu.test
     * @Description:
     * @author: hyacinth
     * @date: 2021年4月5日 下午7:58:37
     * @Copyright:
     */
    public class Test {
    
        public static void main(String[] args) {
            Student student = Builder.of(Student::new)
                    .width(Student::setId, UUID.randomUUID().toString())
                    .width(Student::setName, "张三")
                    .width(Student::setAge, 21)
                    .build();
            Optional<Student> optional1 = Optional.ofNullable(student);
            System.out.println(optional1.isEmpty());
            Optional<Student> optional2 = Optional.ofNullable(null);
            System.out.println(optional2.isEmpty());
        }
    
    }
    
    D:\Java\jdk-15.0.2\bin\java.exe "-javaagent:D:\IDE\IntelliJ IDEA 2020.3.1\lib\idea_rt.jar=9141:D:\IDE\IntelliJ IDEA 2020.3.1\bin" -Dfile.encoding=UTF-8 -classpath E:\SourceCode\Idea-2020.2\JavaProject\target\classes;D:\Learn\OpenCV-4.5.1\build\java\opencv-451.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\mp3spi\1.9.5.4\mp3spi-1.9.5.4.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\jlayer\1.0.1.4\jlayer-1.0.1.4.jar;E:\JAVA\Maven\repository\junit\junit\3.8.2\junit-3.8.2.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\tritonus-share\0.3.7.4\tritonus-share-0.3.7.4.jar;E:\JAVA\Maven\repository\org\jflac\jflac-codec\1.5.2\jflac-codec-1.5.2.jar;E:\JAVA\Maven\repository\org\jaudiotagger\2.0.3\jaudiotagger-2.0.3.jar com.xu.builder.Test
    isEmpty:false
    isEmpty:true
    
    Process finished with exit code 0
    

    12 isPresent()

    package com.xu.builder;
    
    import java.util.Optional;
    import java.util.UUID;
    
    /**
     * All rights Reserved, Designed By Hyacinth
     *
     * @version V1.0
     * @Title: Test.java
     * @Package com.xu.test
     * @Description:
     * @author: hyacinth
     * @date: 2021年4月5日 下午7:58:37
     * @Copyright:
     */
    public class Test {
    
        public static void main(String[] args) {
            Student student = Builder.of(Student::new)
                    .width(Student::setId, UUID.randomUUID().toString())
                    .width(Student::setName, "张三")
                    .width(Student::setAge, 21)
                    .build();
    
            Optional<Student> optional1 = Optional.ofNullable(student);
            System.out.println("isEmpty:" + optional1.isEmpty());
            System.out.println("isPresent:" + optional1.isPresent());
            Optional<Student> optional2 = Optional.ofNullable(null);
            System.out.println("isEmpty:" + optional2.isEmpty());
            System.out.println("isPresent:" + optional2.isPresent());
        }
    
    }
    
    D:\Java\jdk-15.0.2\bin\java.exe "-javaagent:D:\IDE\IntelliJ IDEA 2020.3.1\lib\idea_rt.jar=9252:D:\IDE\IntelliJ IDEA 2020.3.1\bin" -Dfile.encoding=UTF-8 -classpath E:\SourceCode\Idea-2020.2\JavaProject\target\classes;D:\Learn\OpenCV-4.5.1\build\java\opencv-451.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\mp3spi\1.9.5.4\mp3spi-1.9.5.4.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\jlayer\1.0.1.4\jlayer-1.0.1.4.jar;E:\JAVA\Maven\repository\junit\junit\3.8.2\junit-3.8.2.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\tritonus-share\0.3.7.4\tritonus-share-0.3.7.4.jar;E:\JAVA\Maven\repository\org\jflac\jflac-codec\1.5.2\jflac-codec-1.5.2.jar;E:\JAVA\Maven\repository\org\jaudiotagger\2.0.3\jaudiotagger-2.0.3.jar com.xu.builder.Test
    isEmpty:false
    isPresent:true
    isEmpty:true
    isPresent:false
    
    Process finished with exit code 0
    

    13 map(Function<? super T, ? extends U>)

    package com.xu.builder;
    
    import java.util.Optional;
    import java.util.UUID;
    
    /**
     * All rights Reserved, Designed By Hyacinth
     *
     * @version V1.0
     * @Title: Test.java
     * @Package com.xu.test
     * @Description:
     * @author: hyacinth
     * @date: 2021年4月5日 下午7:58:37
     * @Copyright:
     */
    public class Test {
    
        public static void main(String[] args) {
            Student student = Builder.of(Student::new)
                    .width(Student::setId, UUID.randomUUID().toString())
                    .width(Student::setName, "张三")
                    .width(Student::setAge, 21)
                    .build();
            Optional<Student> optional = Optional.of(student).filter(e -> e.getAge() == 21);
            String name = optional.map(Student::getName).get();
            System.out.println(name);
            System.out.println(Optional.ofNullable("1").map(e -> e.concat("->")).get());
        }
    
    }
    
    D:\Java\jdk-15.0.2\bin\java.exe "-javaagent:D:\IDE\IntelliJ IDEA 2020.3.1\lib\idea_rt.jar=9414:D:\IDE\IntelliJ IDEA 2020.3.1\bin" -Dfile.encoding=UTF-8 -classpath E:\SourceCode\Idea-2020.2\JavaProject\target\classes;D:\Learn\OpenCV-4.5.1\build\java\opencv-451.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\mp3spi\1.9.5.4\mp3spi-1.9.5.4.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\jlayer\1.0.1.4\jlayer-1.0.1.4.jar;E:\JAVA\Maven\repository\junit\junit\3.8.2\junit-3.8.2.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\tritonus-share\0.3.7.4\tritonus-share-0.3.7.4.jar;E:\JAVA\Maven\repository\org\jflac\jflac-codec\1.5.2\jflac-codec-1.5.2.jar;E:\JAVA\Maven\repository\org\jaudiotagger\2.0.3\jaudiotagger-2.0.3.jar com.xu.builder.Test
    张三
    1->
    
    Process finished with exit code 0
    

    14 flatMap(Function<? super T, ? extends Optional<? extends U>>)

    flatMap 和 map 方法类似 区别在:
    map会将传入的Function函数的返回的结果进行封装,即 map(student) 变成 Optional<Student>

    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));
        }
    }
    

    flatMap不会将传入的Function函数的返回的结果进行封装,即 map(student) 变成 Student

    public <U> Optional<U> flatMap(Function<? super T, ? extends Optional<? extends U>> mapper) {
        Objects.requireNonNull(mapper);
        if (!isPresent()) {
            return empty();
        } else {
            @SuppressWarnings("unchecked")
            Optional<U> r = (Optional<U>) mapper.apply(value);
            return Objects.requireNonNull(r);
        }
    }
    

    使用区别

    Student student = Builder.of(Student::new)
            .width(Student::setId, UUID.randomUUID().toString())
            .width(Student::setName, "张三")
            .width(Student::setAge, 21)
            .build();
    String name = Optional.of(student).map(Student::getName).get();
    System.out.println(name);
    

    15 or(Supplier<? extends Optional<? extends T>>)

    package com.xu.builder;
    
    import java.util.Optional;
    import java.util.UUID;
    
    /**
     * All rights Reserved, Designed By Hyacinth
     *
     * @version V1.0
     * @Title: Test.java
     * @Package com.xu.test
     * @Description:
     * @author: hyacinth
     * @date: 2021年4月5日 下午7:58:37
     * @Copyright:
     */
    public class Test {
    
        public static void main(String[] args) {
            Student student = Builder.of(Student::new)
                    .width(Student::setId, UUID.randomUUID().toString())
                    .width(Student::setName, "张三")
                    .width(Student::setAge, 21)
                    .build();
            String name = Optional.ofNullable(student).or(() -> Optional.ofNullable(new Student())).map(Student::getName).get();
            System.out.println(name);
        }
    
    }
    
    D:\Java\jdk-15.0.2\bin\java.exe "-javaagent:D:\IDE\IntelliJ IDEA 2020.3.1\lib\idea_rt.jar=9494:D:\IDE\IntelliJ IDEA 2020.3.1\bin" -Dfile.encoding=UTF-8 -classpath E:\SourceCode\Idea-2020.2\JavaProject\target\classes;D:\Learn\OpenCV-4.5.1\build\java\opencv-451.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\mp3spi\1.9.5.4\mp3spi-1.9.5.4.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\jlayer\1.0.1.4\jlayer-1.0.1.4.jar;E:\JAVA\Maven\repository\junit\junit\3.8.2\junit-3.8.2.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\tritonus-share\0.3.7.4\tritonus-share-0.3.7.4.jar;E:\JAVA\Maven\repository\org\jflac\jflac-codec\1.5.2\jflac-codec-1.5.2.jar;E:\JAVA\Maven\repository\org\jaudiotagger\2.0.3\jaudiotagger-2.0.3.jar com.xu.builder.Test
    张三
    
    Process finished with exit code 0
    

    16 orElse(T)

    Optional是否为空都会调用,在Optional为空值的情况下才会执行orElseGet。

    方法区别
    public T orElse(T other)Optional是否为空都执行
    public T orElseGet(Supplier<? extends T> supplier)Optional为空时才调用
    package com.xu.builder;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Optional;
    
    /**
     * All rights Reserved, Designed By Hyacinth
     *
     * @version V1.0
     * @Title: Test.java
     * @Package com.xu.test
     * @Description:
     * @author: hyacinth
     * @date: 2021年4月5日 下午7:58:37
     * @Copyright:
     */
    public class Test {
    
        public static void main(String[] args) {
            List<String> list = Arrays.asList("1", null, "3", "4");
            Optional.ofNullable(list).orElseGet(() -> new ArrayList<>()).forEach(System.out::println);
            Optional.ofNullable("list").orElse(orElse()); // 无论是否为空都调用
            Optional.ofNullable("list").orElseGet(() -> orElseGet()); // 为空时才调用
            Optional.ofNullable(null).orElse(orElse()); // 无论是否为空都调用
            Optional.ofNullable(null).orElseGet(() -> orElseGet()); // 为空时才调用
        }
    
        public static String orElseGet() {
            System.out.println("orElseGet");
            return "orElseGet";
        }
    
        public static String orElse() {
            System.out.println("orElse");
            return "orElse";
        }
    
    }
    
    D:\Java\jdk-15.0.2\bin\java.exe "-javaagent:D:\IDE\IntelliJ IDEA 2020.3.1\lib\idea_rt.jar=9974:D:\IDE\IntelliJ IDEA 2020.3.1\bin" -Dfile.encoding=UTF-8 -classpath E:\SourceCode\Idea-2020.2\JavaProject\target\classes;D:\Learn\OpenCV-4.5.1\build\java\opencv-451.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\mp3spi\1.9.5.4\mp3spi-1.9.5.4.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\jlayer\1.0.1.4\jlayer-1.0.1.4.jar;E:\JAVA\Maven\repository\junit\junit\3.8.2\junit-3.8.2.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\tritonus-share\0.3.7.4\tritonus-share-0.3.7.4.jar;E:\JAVA\Maven\repository\org\jflac\jflac-codec\1.5.2\jflac-codec-1.5.2.jar;E:\JAVA\Maven\repository\org\jaudiotagger\2.0.3\jaudiotagger-2.0.3.jar com.xu.builder.Test
    1
    null
    3
    4
    orElse
    orElse
    orElseGet
    
    Process finished with exit code 0
    

    17 orElseGet(Supplier<? extends T>)

    Optional是否为空都会调用,在Optional为空值的情况下才会执行orElseGet。

    方法区别
    public T orElse(T other)Optional是否为空都执行
    public T orElseGet(Supplier<? extends T> supplier)Optional为空时才调用
    package com.xu.builder;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Optional;
    
    /**
     * All rights Reserved, Designed By Hyacinth
     *
     * @version V1.0
     * @Title: Test.java
     * @Package com.xu.test
     * @Description:
     * @author: hyacinth
     * @date: 2021年4月5日 下午7:58:37
     * @Copyright:
     */
    public class Test {
    
        public static void main(String[] args) {
            List<String> list = Arrays.asList("1", null, "3", "4");
            Optional.ofNullable(list).orElseGet(() -> new ArrayList<>()).forEach(System.out::println);
            Optional.ofNullable("list").orElse(orElse()); // 无论是否为空都调用
            Optional.ofNullable("list").orElseGet(() -> orElseGet()); // 为空时才调用
            Optional.ofNullable(null).orElse(orElse()); // 无论是否为空都调用
            Optional.ofNullable(null).orElseGet(() -> orElseGet()); // 为空时才调用
        }
    
        public static String orElseGet() {
            System.out.println("orElseGet");
            return "orElseGet";
        }
    
        public static String orElse() {
            System.out.println("orElse");
            return "orElse";
        }
    
    }
    
    D:\Java\jdk-15.0.2\bin\java.exe "-javaagent:D:\IDE\IntelliJ IDEA 2020.3.1\lib\idea_rt.jar=9974:D:\IDE\IntelliJ IDEA 2020.3.1\bin" -Dfile.encoding=UTF-8 -classpath E:\SourceCode\Idea-2020.2\JavaProject\target\classes;D:\Learn\OpenCV-4.5.1\build\java\opencv-451.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\mp3spi\1.9.5.4\mp3spi-1.9.5.4.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\jlayer\1.0.1.4\jlayer-1.0.1.4.jar;E:\JAVA\Maven\repository\junit\junit\3.8.2\junit-3.8.2.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\tritonus-share\0.3.7.4\tritonus-share-0.3.7.4.jar;E:\JAVA\Maven\repository\org\jflac\jflac-codec\1.5.2\jflac-codec-1.5.2.jar;E:\JAVA\Maven\repository\org\jaudiotagger\2.0.3\jaudiotagger-2.0.3.jar com.xu.builder.Test
    1
    null
    3
    4
    orElse
    orElse
    orElseGet
    
    Process finished with exit code 0
    

    18 orElseThrow()

    package com.xu.builder;
    
    import java.util.Optional;
    
    /**
     * All rights Reserved, Designed By Hyacinth
     *
     * @version V1.0
     * @Title: Test.java
     * @Package com.xu.test
     * @Description:
     * @author: hyacinth
     * @date: 2021年4月5日 下午7:58:37
     * @Copyright:
     */
    public class Test {
    
        public static void main(String[] args) {
            Optional.ofNullable(null).orElseThrow(); // 为空时抛异常
        }
    
    }
    
    D:\Java\jdk-15.0.2\bin\java.exe "-javaagent:D:\IDE\IntelliJ IDEA 2020.3.1\lib\idea_rt.jar=10385:D:\IDE\IntelliJ IDEA 2020.3.1\bin" -Dfile.encoding=UTF-8 -classpath E:\SourceCode\Idea-2020.2\JavaProject\target\classes;D:\Learn\OpenCV-4.5.1\build\java\opencv-451.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\mp3spi\1.9.5.4\mp3spi-1.9.5.4.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\jlayer\1.0.1.4\jlayer-1.0.1.4.jar;E:\JAVA\Maven\repository\junit\junit\3.8.2\junit-3.8.2.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\tritonus-share\0.3.7.4\tritonus-share-0.3.7.4.jar;E:\JAVA\Maven\repository\org\jflac\jflac-codec\1.5.2\jflac-codec-1.5.2.jar;E:\JAVA\Maven\repository\org\jaudiotagger\2.0.3\jaudiotagger-2.0.3.jar com.xu.builder.Test
    Exception in thread "main" java.util.NoSuchElementException: No value present
    	at java.base/java.util.Optional.orElseThrow(Optional.java:375)
    	at com.xu.builder.Test.main(Test.java:19)
    
    Process finished with exit code 1
    

    19 orElseThrow(Supplier<? extends X>)

    package com.xu.builder;
    
    import java.util.Optional;
    
    /**
     * All rights Reserved, Designed By Hyacinth
     *
     * @version V1.0
     * @Title: Test.java
     * @Package com.xu.test
     * @Description:
     * @author: hyacinth
     * @date: 2021年4月5日 下午7:58:37
     * @Copyright:
     */
    public class Test {
    
        public static void main(String[] args) {
            Optional.ofNullable(null).orElseThrow(() -> new RuntimeException()); // 为空时抛异常
        }
    
    }
    
    D:\Java\jdk-15.0.2\bin\java.exe "-javaagent:D:\IDE\IntelliJ IDEA 2020.3.1\lib\idea_rt.jar=10331:D:\IDE\IntelliJ IDEA 2020.3.1\bin" -Dfile.encoding=UTF-8 -classpath E:\SourceCode\Idea-2020.2\JavaProject\target\classes;D:\Learn\OpenCV-4.5.1\build\java\opencv-451.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\mp3spi\1.9.5.4\mp3spi-1.9.5.4.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\jlayer\1.0.1.4\jlayer-1.0.1.4.jar;E:\JAVA\Maven\repository\junit\junit\3.8.2\junit-3.8.2.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\tritonus-share\0.3.7.4\tritonus-share-0.3.7.4.jar;E:\JAVA\Maven\repository\org\jflac\jflac-codec\1.5.2\jflac-codec-1.5.2.jar;E:\JAVA\Maven\repository\org\jaudiotagger\2.0.3\jaudiotagger-2.0.3.jar com.xu.builder.Test
    Exception in thread "main" java.lang.RuntimeException
    	at com.xu.builder.Test.lambda$main$0(Test.java:19)
    	at java.base/java.util.Optional.orElseThrow(Optional.java:401)
    	at com.xu.builder.Test.main(Test.java:19)
    
    Process finished with exit code 1
    

    20 stream()

    package com.xu.builder;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Optional;
    
    /**
     * All rights Reserved, Designed By Hyacinth
     *
     * @version V1.0
     * @Title: Test.java
     * @Package com.xu.test
     * @Description:
     * @author: hyacinth
     * @date: 2021年4月5日 下午7:58:37
     * @Copyright:
     */
    public class Test {
    
        public static void main(String[] args) {
            List<String> list = Arrays.asList("1", null, "3", "4", "5", "6");
            Optional.ofNullable(list).orElseGet(() -> new ArrayList<>()).stream().skip(1).limit(3).forEach(strings -> {
                System.out.println(strings);
            });
        }
    
    }
    
    D:\Java\jdk-15.0.2\bin\java.exe "-javaagent:D:\IDE\IntelliJ IDEA 2020.3.1\lib\idea_rt.jar=10476:D:\IDE\IntelliJ IDEA 2020.3.1\bin" -Dfile.encoding=UTF-8 -classpath E:\SourceCode\Idea-2020.2\JavaProject\target\classes;D:\Learn\OpenCV-4.5.1\build\java\opencv-451.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\mp3spi\1.9.5.4\mp3spi-1.9.5.4.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\jlayer\1.0.1.4\jlayer-1.0.1.4.jar;E:\JAVA\Maven\repository\junit\junit\3.8.2\junit-3.8.2.jar;E:\JAVA\Maven\repository\com\googlecode\soundlibs\tritonus-share\0.3.7.4\tritonus-share-0.3.7.4.jar;E:\JAVA\Maven\repository\org\jflac\jflac-codec\1.5.2\jflac-codec-1.5.2.jar;E:\JAVA\Maven\repository\org\jaudiotagger\2.0.3\jaudiotagger-2.0.3.jar com.xu.builder.Test
    null
    3
    4
    
    Process finished with exit code 0
    
    展开全文
  • java Optional

    2021-03-12 11:13:26
    import java.util.Optional; public class TestNPE { public static void main(String[] args) { TestDemo testDemo = new TestDemo(); getCount(testDemo); } private static void getCount(TestDemo ...

    NPE问题,可使用Optional优雅的方式避免多层if判断。

    import java.util.Optional;
    
    public class TestNPE {
        public static void main(String[] args) {
            TestDemo testDemo = new TestDemo();
            getCount(testDemo);
        }
    
        private static void getCount(TestDemo testDemo) {
            //Java8-Optional:优雅,可读性较好
            int count3 = Optional.ofNullable(testDemo).map(TestDemo::getCount).orElse(1);
            System.out.println(count3);
    
            if(testDemo!=null && testDemo.getCount()!=null){
                System.out.println(testDemo.getCount());
            }
        }
    
        private static class TestDemo {
            private Integer count;
    
            public Integer getCount() {
                return count;
            }
        }
    }
    

    注意,这里 相当于判断了testDemo本身不为空且 testDemo.getCount()不为空。

    orElse()

    当optional值不存在时,调用orElse()返回orElse()的参数,如果optional的值存在时返回optional的值

    orElseGet()

    当optional值不存在时,调用orElseGet()中接口调用的返回值,如果optional的值存在时返回optional的值,例子如下:

    import java.util.Optional;
    
    public class Main {
        public static void main(String[] args){
            String nullValue = null;
            String optional = Optional.ofNullable(nullValue).orElse("Su");
            System.out.println(optional);
            String optionalGet = Optional.ofNullable(nullValue).orElseGet(() -> "Xiao");
            System.out.println(optionalGet);
            String nonNullOptional = Optional.ofNullable("Susan").orElse("Su");
            System.out.println(nonNullOptional);
            String nonNullOptionalGet = Optional.ofNullable("Molly").orElseGet(() -> "Xiao");
            System.out.println(nonNullOptionalGet);
        }
    }
    
    

    结果:

    Su
    Xiao
    Susan
    Molly
    

    orElse()和orElseGet()的区别

    首先我们举例比较一下在optional有值和不存在值使用两种方法的样例:

    • optional有值:
    import java.util.Arrays;
    import java.util.List;
    
    public class orElseOrElseGetComparation {
        public static void main(String[] args){
            List<Integer> list = Arrays.asList(23,1,3);
            int myElse = list.stream().reduce(Integer::sum).orElse(get("myElse"));
            int myElseGet = list.stream().reduce(Integer::sum).orElseGet(() -> get("myElseGet"));
            System.out.println("myElse的值"+myElse);
            System.out.println("myElseGet的值"+myElseGet);
    
        }
        public static int get(String name){
            System.out.println(name+"执行了该方法");
            return 1;
        }
    }
    
    

    结果:

    myElse执行了该方法
    myElse的值27
    myElseGet的值27
    
    • 当optional为空值
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Optional;
    
    public class orElseOrElseGetComparation {
        public static void main(String[] args){
            List<Integer> list = null;
            List<Integer> myElse = Optional.ofNullable(list).orElse(get("myElseGet"));
            List<Integer> myElseGet = Optional.ofNullable(list).orElseGet(() -> get("myElseGet"));
            System.out.println("myElse的值"+myElse);
            System.out.println("myElseGet的值"+myElseGet);
    
        }
        public static List<Integer> get(String name){
            System.out.println(name+"执行了该方法");
            List<Integer> arr = new ArrayList<>();
            arr.add(1);
            return arr;
        }
    }
    

    结果:

    myElseGet执行了该方法
    myElseGet执行了该方法
    myElse的值[1]
    myElseGet的值[1]
    

    从上面optional为空值和有值的情况的例子可以看到orElse在不论optional有没有值的时候都会执行,在optional为空值的情况下orElse和orElseGet都会执行,当optional不为空时,orElseGet不会执行。

    参考链接:
    1、https://www.jianshu.com/p/790f7c185d3e

    展开全文
  • Java Optional orElse,orElseGet,orElseThrow()用法及代码示例 我们都知道,Optional类是Java8为了解决null值判断问题,使用Optional类可以避免显式的判断null值(null的防御性检查),避免null导致的NPE...

    Java Optional orElse,orElseGet,orElseThrow()用法及代码示例

    我们都知道,Optional类是Java8为了解决null值判断问题,使用Optional类可以避免显式的判断null值(null的防御性检查),避免null导致的NPE(NullPointerException) 。

    在介绍这三个方法之前,先讲讲 Optional 的 ofNullable() 方法,因为他们常常搭配一起使用。

    我们来看看 ofNullable() 方法的源码:

    /**
     * A container object which may or may not contain a non-null value.
     * If a value is present, {@code isPresent()} will return {@code true} and
     * {@code get()} will return the value.
     */
     public final class Optional<T> {
    
        /**
         * Common instance for {@code empty()}.
         */
        private static final Optional<?> EMPTY = new Optional<>(); //执行Optional的无参构造
        
    	//无参构造
    	private Optional() {
            this.value = null;
        }
        //有参构造
        private Optional(T value) {
            this.value = Objects.requireNonNull(value);
        }
        /**
         * Returns an {@code Optional} describing the specified value, if non-null,
         * otherwise returns an empty {@code Optional}.
         * 如果value不是null, 返回它自己本身, 是空, 则执行empty(), 返回null
         *
         * @param <T> the class of the value
         * @param value the possibly-null value to describe
         * @return an {@code Optional} with a present value if the specified value
         * is non-null, otherwise an empty {@code Optional}
         */
        public static <T> Optional<T> ofNullable(T value) {
            return value == null ? empty() : of(value);
        }
        /**
         * Returns an empty {@code Optional} instance.  No value is present for this
         * Optional.
         * 当value是空时, 返回Optional<T>对象
         *
         * @apiNote Though it may be tempting to do so, avoid testing if an object
         * is empty by comparing with {@code ==} against instances returned by
         * {@code Option.empty()}. There is no guarantee that it is a singleton.
         * Instead, use {@link #isPresent()}.
         *
         * @param <T> Type of the non-existent value
         * @return an empty {@code Optional}
         */
        public static<T> Optional<T> empty() {
            @SuppressWarnings("unchecked")
            Optional<T> t = (Optional<T>) EMPTY;  //由第一行代码可知, EMPTY是一个无参Optional对象
            return t;
        }
       
        /**
         * Returns an {@code Optional} with the specified present non-null value.
         * 返回不等于null的value值本身
         *
         * @param <T> the class of the value
         * @param value the value to be present, which must be non-null
         * @return an {@code Optional} with the value present
         * @throws NullPointerException if value is null
         */ 
        public static <T> Optional<T> of(T value) {
            return new Optional<>(value);  //执行Optional的有参构造
        }
     }
    

    所以大家懂了吗? ofNullable() 就是做了null值判断, 所以我们直接调用此方法就可以了, 而不需要我们自己手动判断null值 。

    而 orElse(),orElseGet() ,orElseThrow() 这三个方法都是用来处理null值的情况:

    orElse() : 当值为null时, 返回的是该方法的参数 。但值不为null时, 返回值本身。

    源码 :

        /**
         * Return the value if present, otherwise return {@code other}.
         * 如果值存在(即不等于空), 返回值本身, 如果等于空, 就返回orElse()方法的参数other.
         *
         * @param other the value to be returned if there is no value present, may
         * be null
         * @return the value, if present, otherwise {@code other}
         */
        public T orElse(T other) {
            return value != null ? value : other;
        }
    

    使用示例 :

    如果ofNullable()不等于null, 则返回scRespDTO.getMsgBody().getSuccess()的值;
    如果为null, 则返回false (即返回orElse()的参数)。

    //如果ofNullable()不等于null, 则返回scRespDTO.getMsgBody().getSuccess()的值, 
    //如果为null, 则返回false (即返回orElse()的参数)
    Optional.ofNullable(scRespDTO.getMsgBody().getSuccess()).orElse(false)
    

    orElseGet() : 当值为null时, 返回的是实现了Supplier接口的对象的 get() 值 。但值不为null时, 返回值本身。

    源码 :

        /**
         * Return the value if present, otherwise invoke {@code other} and return
         * the result of that invocation.
         * 值如果存在(即不为空), 返回值本身, 如果不存在, 则返回实现了Supplier接口的对象. 
         * Supplier接口就只有一个get()方法. 无入参,出参要和Optional的对象同类型.
         *
         * @param other a {@code Supplier} whose result is returned if no value
         * is present
         * @return the value if present otherwise the result of {@code other.get()}
         * @throws NullPointerException if value is not present and {@code other} is
         * null
         */
        public T orElseGet(Supplier<? extends T> other) {
            return value != null ? value : other.get();
        }
    

    使用示例 :

    // orElseGet 它可以传入一个supplier接口,里面可以花样实现逻辑
    System.out.println(Optional.ofNullable("努力成为一名更优秀的程序媛").orElseGet(()->"你不够优秀"));  // ofNullable()不为空,就输出"努力成为一名更优秀的程序媛",反之,则输出"你不够优秀"
    System.out.println(Optional.ofNullable(null).orElseGet(()->"你没有努力"));  // ofNullable()为null, 输出 "你没有努力"
    

    【Tip: 肯定有很多小伙伴觉得 orElse() 和 orElseGet() 方法没有区别,当值为null时,两者都是返回这两方法的参数。但是区别就是,orElseGet() 并不是直接返回参数本身,而是返回参数的get()值,且该参数对象必须实现 supplier 接口(该接口为函数式接口)。这样使得orElseGet()更加灵活。

    orElseThrow() : 当值为null时, 返回的是实现了Supplier接口的对象的 get() 值 。但值不为null时, 返回值本身。

    源码:

        /**
         * Return the contained value, if present, otherwise throw an exception
         * to be created by the provided supplier.
         *
         * @apiNote A method reference to the exception constructor with an empty
         * argument list can be used as the supplier. For example,
         * {@code IllegalStateException::new}
         *
         * @param <X> Type of the exception to be thrown
         * @param exceptionSupplier The supplier which will return the exception to
         * be thrown
         * @return the present value
         * @throws X if there is no value present
         * @throws NullPointerException if no value is present and
         * {@code exceptionSupplier} is null
         */
        public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
            if (value != null) {
                return value;
            } else {
                throw exceptionSupplier.get();
            }
        }
    

    使用示例 :

    如果ofNullable()不等于null,则返回值本身,即user对象;
    如果为null, 则发生指定的异常。(可以使用 :: 形式,这个冒号后面是自定义异常,还可以使用 Lambda 表达式直接引用Java类定义的异常。示例已演示了。)

    	//如果user对象为null,且new实现了异常,就以new的形式抛异常,否则抛ArithmeticException异常
    	Optional.ofNullable(user).orElseThrow(ArithmeticException::new)); 
    	
    	//如果user对象不为null,返回该对象,否则抛NullPointerException。异常
    	//orElseThrow()如果存在该值,返回包含的值,否则抛出由 Supplier 继承的异常
    	Optional.ofNullable(user).orElseThrow(() -> new NotFoundException("记录不存在"));
    

    大家知道了吗?有没有帮助到你们呢?可以评论告诉我哦。
    无论如何我们一起努力成长吖~ 成为一名更优秀的程序媛 😃

    展开全文
  • //序列化时name字段是Optional类型,不支持序列化,报如下异常: //Exception in thread "main" java.io.NotSerializableException: java.util.Optional out.writeObject(test); ObjectInputStream in = ...

    你知道的越多,不知道的就越多,业余的像一棵小草!

    你来,我们一起精进!你不来,我和你的竞争对手一起精进!

    编辑:业余草

    推荐:https://www.xttblog.com/?p=5138

    面试官:Java Optional 为什么设计成不可序列化的?

    Optional 自 Java8 发布以来深受喜爱。很多人认为它是来解决“空”异常问题的,其实它并不能解决空异常,它只是一个容器,这个容器内的对象可能为空,需要使用者自行判断。

    Optional 提供的只是一种思想,很多程序员不明其意,代码中存在不少乱用的情况,尤其是中国程序员。以至于,我在面试候选人的时候,问到“Java Optional 为什么设计成不可序列化的?”几乎没有人能回答到点子上。

    身边不少的同事也仅仅是停留在使用上,如果稍微问他们几个问题,就会得到“不知道,大家都这么用,我和别人的用法一样”等等类似的答案。更有甚者,把实体类中的所有属性都用上 Optional。

    import java.io.*;
    import java.util.Optional;
    
    public class XttblogTest implements Serializable {
        private Optional<String> name;
        private Integer age;
     
        public Optional<String> getName() {
            return name;
        }
     
        public void setName(Optional<String> name) {
            this.name = name;
        }
     
        public Integer getAge() {
            return age;
        }
     
        public void setAge(Integer age) {
            this.age = age;
        }
     
        public static void main(String[] args) throws Exception {
            XttblogTest test = new XttblogTest();
            test.setName(Optional.of("业余草"));
            ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data"));
            //序列化时name字段是Optional类型,不支持序列化,报如下异常:
            //Exception in thread "main" java.io.NotSerializableException: java.util.Optional
            out.writeObject(test);
     
            ObjectInputStream in = new ObjectInputStream(new FileInputStream("data"));
            XttblogTest obj = (XttblogTest) in.readObject();
            Optional<String> name = obj.getName();
            Integer age = obj.getAge();
            System.out.println(name);
            System.out.println(age);
        }
    }
    

    平时这样使用一点问题也没有,但是当遇到序列化时,就会曝出Exception in thread "main" java.io.NotSerializableException: java.util.Optional异常。

    这样的问题,我在 Code Review 时再三强调,还总是有人愿做“出头鸟”。

    如果一定要使用 Optional,或者线上的代码已经被其他人多次调用了,可以把属性上的 Optional 去掉,get 方法上保留。这样就可以继续序列化了。

    import java.io.*;
    import java.util.Optional;
    
    public class CodedqTest implements Serializable {
        private String name;
        private Integer age;
     
        public Optional<String> getName(){
            return Optional.ofNullable(this.name);
        }
     
        public void setName(String name) {
            this.name = name;
        }
     
        public Integer getAge() {
            return age;
        }
     
        public void setAge(Integer age) {
            this.age = age;
        }
     
        public static void main(String[] args) throws Exception {
            CodedqTest test = new CodedqTest();
            test.setName("业余草");
            ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data"));
            out.writeObject(test);
     
            ObjectInputStream in = new ObjectInputStream(new FileInputStream("data"));
            CodedqTest obj = (CodedqTest) in.readObject();
            Optional<String> name = obj.getName();
            Integer age = obj.getAge();
            System.out.println(name);//Optional[业余草]
            System.out.println(age);//null
        }
    }
    

    当然最好的做法是,不在实体类中使用 Optional。

    因为,Java 官方根本就不推荐 Optional 用在实体属性上,这也是 Java 设计出 NotSerializableException 异常的原因之一。

    Optional 推荐的用法是在函数返回值上。告诉函数调用者,返回的对象存在空异常的可能,需要调用者自行处理。

    具体 Optional 的用法,不是本文重点,感兴趣的可以收藏下图。

    回到主题,Java 在设计 Optional 之初就把它设计为不可序列化的。具体可以参见 Java Lambda(JSR-335)专家组的讨论http://mail.openjdk.java.net/pipermail/jdk8-dev/2013-September/003274.html

    我选择了一些内容,供大家参考。

    首先,官方推荐的是在函数返回值的位置上使用 Optional,而不是属性,集合等位置。

    Map<Optional<List<String>>>
    List<Optional<Map<String>>>
    List<Optional<String >>>
    // ...
    

    其次,Optional 作为一个包装类,大量的 Optional 会消耗过多的内存。Optional 在字段中使用可能会浪费内存,并减慢数据结构的遍历速度。

    第三,官方也不推荐在序列化、永久存储或通过网络传输中使用 Optional。

    第四,在方法的参数中,也不推荐使用 Optional。

    public Foo doSomething(String id, Optional<String> barOptional);
    
    // 调用方法
    foo("业余草", Optional.of("baz"));
    foo("业余草", Optional.empty());
    

    这种情况下,最好的办法是拥有一个重载的方法,该方法接受单个字符串参数并为第二个提供默认值:

    foo("业余草", "baz");
    foo("业余草");
    

    第五,官方推荐通过在 Stream 流管道(或其他方法)返回 Optional。

    Optional 的设计初衷在于,消除“null”而提高可读性,Optional 的最大优点是其“防白痴”。如果你调用了一个返回值为 Optional 的 API,它会迫使您积极考虑不存在的情况,你必须主动的展开 Optional 并解决该情况。

    Optional 的出现并不是为了替代 null,而是用来表示一个不可变的容器,它可以包含一个非 null 的 T 引用,也可以什么都不包含(不包含不等于 null),非空的包含被称作 persent,而空则被称作 absent。

    本质上讲 Optional 类似于异常检查,它迫使 API 用户去关注/处理 Optional 中是否包含内容,从而避免因为忽略 null 值检查而导致的一些潜在隐患。

    最后,在序列化方面。JDK 的序列化比较特殊,需要同时向前及向后兼容,如在 JDK7 中序列化的对象需要能够在 JDK8 中反序列化,同样在 JDK8 中序列化的对象需要能够在 JDK7 中能够反序列化;其次,序列化需要依赖于对象的 identity。

    有了以上两个序列化的前提条件,再结合 Optional 目前是 reference type 的,但其被标记为 value based class,其有计划在今后的某一个 JDK 版本中将其实现为 value type。

    如果 Optional 设计为序列化的,那现在就有两个矛盾点:

    • 如果 Optional 可以序列化,那就没办法将 Optional 实现为 value type,而必须是 reference type

    • 或者将 value type 加入 identity-sensitive operations,这对于目前所有已发行的 JDK 版本都是相冲突的

    所以,虽然现在 Optional 是 reference type,但有计划将其实现为 value type,考虑到 JDK 序列化的向前及向后兼容性,从一开始就将 Optional 定为不可序列化,应该是最合适的方案了。

    展开全文
  • Java中的java.util.Optional类的ofNullable()方法用于获取具有指定类型的指定值的Optional类的实例。如果指定的值为null,则此方法返回Optional类的空实例。用法:public static Optional ofNullable(T value)参数:...
  • of(long)方法有助于我们获得OptionalLong对象,该对象包含一个long值,该long值作为参数传递给此方法。用法:public static OptionalLong of(long value)参数:此方法接受一个long值作为参数,该值将设置为返回的...
  • Java中的java.util.Optional类的orElse()方法用于获取此Optional实例(如果存在)的值。如果此Optional实例中不存在任何值,则此方法返回指定的值。用法:public T orElse(T value)参数:如果此Optional实例中没有值,...
  • 而且findById通过主键查询数据返回值不再是实体对象了,而是Optional<实体对象>对象,Optional对象是jdk1.8以后才支持的,所以要使用jpa2.5x需要至少jdk1.8或以上。 什么是Optional Optional主要是针对null值...
  • 1、转换方法代码public List get(Optional foo) {return foo.map(x -> x.getBazList().stream().map(Baz::getBar).collect(Collectors.toList())).orElse(Collections.emptyList());}或public List get(Optional ...
  • Java中的java.util.Optional类的filter()方法用于通过将此Optional实例的值与给定的谓词进行匹配来过滤此Optional实例的值,然后返回已过滤的Optional实例。如果此Optional实例中没有值,则此方法返回一个空的...
  • Java中的java.util.Optional类的orElseThrow()方法用于获取此Optional实例(如果存在)的值。如果此Optional实例中不存在任何值,则此方法将引发从指定供应商生成的异常。用法:public TorElseThrow(Supplier ...
  • toString()方法可帮助我们获取此OptionalDouble的非空字符串表示形式。此非空字符串表示形式适合调试。确切的演示格式未指定,并且在实现和版本之间可能有所不同。用法:public String toString()参数:此方法不接受...
  • Java中的java.util.Optional类的empty()方法用于获取此Optional类的空实例。该实例不包含任何值。用法:public static Optional empty()参数:此方法不接受任何内容。返回值:此方法返回此Optional类的空实例。以下...
  • Java Optional 实例介绍

    2021-03-06 13:43:51
    原标题:Java Optional 实例介绍编译:ImportNew/唐尤华dzone.com/articles/java-optionalOptional是一种容器对象,可能包含也可能不含非null值。如果包含某个值isPresent返回true,调用get返回该值。Package : java...
  • Java中的java.util.Optional类的toString()方法用于获取此Optional实例的字符串表示形式。用法:public String toString()参数:此方法不接受任何内容。返回值:此方法返回此Optional实例的字符串表示形式。以下示例...
  • Java中的java.util.Optional类的isPresent()方法用于确定此Optional实例中是否存在值。如果此Optional实例中不存在任何值,则此方法返回false,否则返回true。用法:public boolean isPresent()参数:此方法不接受...
  • OptionalInt帮助我们创建一个可能包含或可能不包含Int值的对象。 isPresent()方法可帮助我们获得答案:Int值是否存在于OptionalInt对象中。如果此对象中存在int值,则此方法返回true,否则返回false。用法:public ...
  • 如果存在任何值,则使用Javajava.util.Optional类的or()方法来获取此Optional实例。如果此Optional实例中不存在任何值,则此方法返回一个Optional实例,其中包含从指定供应商生成的值。用法:public Optional or...
  • Java中的java.util.Optional类的equals()方法用于检查此Optional与指定的Optional是否相等。此方法采用Optional实例,并将其与此Optional进行比较,并返回表示该实例的布尔值。用法:public boolean equals(Object ...
  • The ideal solution is “command-query separation”: Make one method (command) for doing something with the string if it is present. And another method (query) to tell you whether it was there.However,...
  • 这是piotr szybicki4年来为了解正确使用Optional类型而努力的结果。Optional隐藏了可能存在空指针的不确定性,比如:List numbers= ImmutableList.of("ONE","TWO","THREE");return numbers.stream().filter(number -...
  • Java Optional实践(小结)

    2021-03-26 10:36:14
    下面是Spring Boot 1.5的写法,那请问:如果上面的写法是正确的,那为什么还要大费周章设计一个Optional呢?catRepository.findOne(id);分析通过get是能获取到我们需要的对象。但是看看get的源代码,这样写,抛出了...
  • java.util.Optional类的ifPresentOrElse(Consumer,Runnable)方法可帮助我们执行此Optional对象的值的指定消费者操作。如果此Optional中不存在值,则此方法执行给定的基于空的Runnable emptyAction,作为第二个参数...
  • Java Optional使用指南

    2021-01-29 09:49:16
    Java Optional使用指南。
  • 如果存在Long值,则hashCode()方法可帮助我们获取该值的哈希码,如果OptionalLong对象中不存在Long值,则为0(零)。用法:public int hashCode()参数:此方法接受不接受任何参数。返回值:此方法返回当前值的哈希码值...
  • ifPresentOrElse(java.util.function.LongConsumer,java.lang.Runnable)方法可帮助我们执行此OptionalLong对象的值的指定LongConsumer操作。如果此OptionalLong中不存在值,则此方法执行给定的基于空的Runnable ...
  • Java Optional

    2021-04-04 00:50:37
    OptionalOptional类是null值得容器,可以保存类型为T的泛型的值或null,很好的解决了空值的包装问题。 先看源码(去掉原始注释,减少阅读量),源代码比一堆文字解释更清晰 public final class Optional<T&...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 156,106
精华内容 62,442
关键字:

javaoptional

java 订阅