铂西学习日记---optional容器类

本文深入解析Java 8中Optional类的使用,介绍其创建方式、常用方法如isPresent(), get(), ifPresent(), orElse等,并演示如何通过map()和flatMap()进行数据转换。重点在于如何通过Optional防止空指针异常,提升代码健壮性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.util.Optional;

public class optionalDemo {
    public static void main(String[] args) {
        demo();
    }
    /**
     * Optional容器类(JDK1.8) 
     * Optional是Java8引入的一个很有趣的特性,主要解决的问题是臭名昭著的 ·空指针异常·
     *
     * 这是一个可以为null的容器对象。如果值存在则isPresent(方法会返回true,调用get()方法会返回该对象。
     *
     * of:为非null的值创建一个Optional.
     *
     * ofNullable:为指定的值创建一-个Optional, 如果指定的值为null,则返回一个空的Optional。
     *
     * isPresent:如果值存在返回true,否则返回false。
     *
     * get:如果Optional有值则将其返回,否则抛出NoSuchElementException。
     *
     * ifPresent:如果Optional实例有值则为其调用consumer,否则不做处理
     *
     * orElse:如果有值则将其返回,否则返回指定的其它值。
     *
     * orElseGet:orElseGet与orElse方法类似,区别在于得到的默认值。orElse方法将传入的字符串作为默认值。
     * orElseGet方法可以接受Supplier接口的实现用来生成默认值。
     *
     * orElseThrow:如果有值则将其返回,否则抛出supplier接口创建的异常。
     *
     * map:如果有值,则对其执行调用mapping函数得到返回值。
     * 如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。
     *
     * flatMap:如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。
     * flatMap与 map (Funtion)方法类似,区别在于flatMap中的mapper返回值必须是Optional。调用结束时,flatMap不会对结果用Optional封装。
     *
     * filter:如果有值且满足断言条件返回包含该值的optional,否则返回空optional
     */

    public static void demo(){
        //创建optional的方式,第3种更严谨
        Optional<String> optional = Optional.of("bin");
        Optional<String> optional2 = Optional.empty();
        Optional<String> optional3 = Optional.ofNullable("bin");//此处传入的为null就会调用empty()方法

        //判断有无值,值存在返回true,否则返回false
        boolean present1 = optional.isPresent();
        System.out.println(present1);
        boolean present2 = optional2.isPresent();
        System.out.println(present2);

        //获取容器中的值
        System.out.println(optional.get());

        //有值就按照定义的方法执行,否则就什么也不做
        optional.ifPresent(v-> System.out.println("value:"+v));

        //有值就返回值,否则返回一个固定的值
        String isV1 = optional.orElse("无值");
        System.out.println(isV1);
        String isV2 = optional2.orElse("无值");
        System.out.println(isV2);

        //接受方法的方法的返回值
        System.out.println(optional2.orElseGet(() -> "lsq"));

        //有值就返回,否则就抛出异常
//        try {
//            optional2.orElseThrow(()->new Exception());
//        } catch (Exception e) {
//            e.printStackTrace();
//        }

        //map 映射后返回optional
        Optional<String> optional4 = optional.map((v) -> v.toUpperCase());
        System.out.println(optional4.get());

        //flatMap与map不同的是不会封装成optional
        Optional<String> optional5 = optional.flatMap((v) -> Optional.of(v.toUpperCase() + "123"));
        System.out.println(optional5.get());

        //filter 过滤
        Optional<String> optional6 = optional.filter((v)->v.length()>=4);
        System.out.println(optional6.orElse("这个值的长度小于4"));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小狗铂西

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值