Java之optional 教程

package com.liaoxuefeng.rFunctional.cOptional;

import java.util.Optional;

/**
 * @author Alex
 * @since 2023/9/27 上午10:47
 * <p>
 * 参考教程:https://www.cnblogs.com/fuzongle/p/11871607.html
 * </p>
 */
public class OptionalDemo {

    /**
     * 1. Optional是一个容器对象,它包括了我们需要的对象,使用Optional我们就不用显式进行空指针检查。
     * 2.Optional类的Javadoc描述如下:这是一个可以为null的容器对象。如果值存在
     * 则isPresent()方法会返回true,调用get()方法会返回该对象
     * Optional 常用的一些方法
     * 一、创建Optional对象的方法
     * 1. Optional.of(T t) : 创建一个Optional实例
     * 2. Optional.empty() : 创建一个空的Optional实例
     * 3. Optional.ofNullable(T t) : 若t不为null,创建Optional实例,否则创建空实例
     */
    public static void createObject() {

        // 方式一:
        Optional<Object> o1 = Optional.of("hello");
        System.out.println("o1.isPresent() = " + o1.isPresent());
        // 方式二:
        Optional<Object> o2 = Optional.empty();
        System.out.println("o2.isPresent() = " + o2.isPresent());

        // 方式三:一般使用他,可以防止空指针异常
        Optional<String> o3 = Optional.ofNullable("hello");
        System.out.println("o1.isPresent() = " + o3.isPresent());

    }

    /**
     * optional 容器中是否包含对象
     * 1. boolean isPresent():判断是否包含对象
     * 2. void ifPresent(Consumer<? super T> consumer) 如果有值,就执行Consumer接口的实现代码,并且该值会作为参数传给它。
     */
    public static void isPresentMethod() {

        Optional<String> o1 = Optional.ofNullable("AA");
        System.out.println("o1.isPresent() = " + o1.isPresent());
        o1.ifPresent(System.out::println);
    }

    /**
     * 获取Optional容器的对象
     * T get():如果调用对象包含值,返回该值,否则抛异常
     * T orElse(T other):如果有值则将其返回,否则返回特定的other对象
     * T orElseGet(Supplier<? extends T> other) :如果有值则将其返回,否则返回由
     * Supplier接口实现提供的对象。
     *  T orElseThrow(Supplier<? extends X> exceptionSupplier) :如果有值则将其返
     * 回,否则抛出由Supplier接口实现提供的异常。
     */
    public static void getMethods() {
        // get()方法
        Optional<String> o1 = Optional.ofNullable("hello");
        String s = o1.get();
        System.out.println("s = " + s);

        Boy b = new Boy();
        b.setName("李将");
        Optional<Girl> opt = Optional.ofNullable(b.getGirlFriend());
        // 获取对象,如果没有抛出异常
        // Girl girl = opt.get();
        // System.out.println("girl = " + girl);
        //如果获取不到就给一个默认的值
        Girl girl = opt.orElse(new Girl("王娅琴"));
        System.out.println("girl = " + girl);
        //获取不到给一个函数返回
        Girl girl2 = opt.orElseGet((() -> new Girl("王婷婷")));
        System.out.println("girl2 = " + girl2);

        try {
            //获取不到给出一个异常
            Girl girl1 = opt.orElseThrow();
            System.out.println("girl1 = " + girl1);

            Girl girl3 = opt.orElseThrow(NullPointerException::new);
            Girl girl4 = opt.orElseThrow((() -> new RuntimeException("空指针异常!")));
        } catch (NullPointerException e) {
            throw new RuntimeException(e);
        }

    }

    //map 用法
    //如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。
    public static void mapMethod() {

        Optional<String> str = Optional.ofNullable("hello");
        Optional<String> s = str.map(String::toUpperCase);
        System.out.println("s = " + s.orElse("no value found"));
    }

    //flatMap 方法
    //如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。flatMap与map(Funtion)方法类似,区别在于flatMap中的mapper返回值必须是Optional。调用结束时,flatMap不会对结果用Optional封装。而map方法的mapping函数返回值可以是任何类型T,调用结束时,map一定会对结果用Optional封装,如果mapper返回值是Optional,那么map就会将结果封装成Optional<Optional>类型。
    public static void flatMapMethod() {

        Optional<String> name = Optional.ofNullable("hello");
        Optional<String> s1 = name.flatMap(s -> Optional.ofNullable(s.toUpperCase()));
        System.out.println("s1 = " + s1.orElse("no value found"));
    }

    //filter 方法
    //filter方法通过传入限定条件对Optional实例的值进行过滤。如果有值并且满足断言条件返回包含该值的Optional,否则返回空Optional。
    public static void filterMethod(){

        Optional<String> name = Optional.ofNullable("hello");
        Optional<String> s1 = name.filter(s -> s.contains("h"));
        System.out.println(s1.orElse("no value found"));
        Optional<String> s2 = name.filter(s -> s.length() > 8);
        System.out.println(s2.orElse("str length is no 8 "));

    }

    public static void main(String[] args) {

        //createObject();
        //isPresentMethod();
        //getMethods();
        //mapMethod();
        //flatMapMethod();
        filterMethod();
    }

}


posted @ 2024-11-18 14:40  快乐小王子帅气哥哥  阅读(5)  评论(0编辑  收藏  举报

Loading