java8 容器类Optional学习笔记

本文深入解析Java8中Optional容器类的使用,旨在解决空指针异常的问题,详细介绍了Optional的各种方法,如of、ofNullable、isPresent、get、ifPresent等,并通过示例代码展示其功能。

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

java8 容器类Optional学习笔记


java8引入入了·一个1容器类Optional,解决了空指针异常不容易查找的痛点问题。java8 DOC中介绍:

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

Option提供的方法

of

为非null的值创建一个Optional。
of方法通过工厂方法创建Optional类。需要注意的是,创建对象时传入的参数不能为null。如果传入参数为null,则抛出NullPointerException 。

Optional<Student> s = Optional.of(new Student(222, "华仔", 8888));
System.out.println(s.get());//student{age=222, name='华仔', many=8888}

Optional<Student> s = Optional.of(null);
抛出异常:java.lang.NullPointerException
ofNullable

为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional。

isPresent

如果值存在返回true,否则返回false。

Optional s = Optional.ofNullable(null);
System.out.println(s.isPresent());//false
get

如果Optional有值则将其返回,否则抛出NoSuchElementException。

Optional<Student> s = Optional.of(new Student(222, "华仔", 8888));
System.out.println(s.get());//student{age=222, name='华仔', many=8888}
ifPresent

如果Optional实例有值则为其调用consumer,否则不做处理。注意:这里调用的是Consumer消费型接口,有参数,无返回值。

Optional<Student> s = Optional.of(new Student(36, "AA", 9000));
        s.ifPresent((e)->{
            e.setName("AA+BB+CC");
            System.out.println(e);//student{age=36, name='AA+BB+CC', many=9000}
        });

orElse

如果有值则将其返回,否则返回指定的其它值。

Optional<Student> s = Optional.of(new Student(36, "AA", 9000));
System.out.println(s.orElse(new Student(100, "其他", 9000)));//student{age=36, name='AA', many=9000}

Optional<Student> s = Optional.ofNullable(null);//如果使用of会报出空指针异常
System.out.println(s.orElse(new Student(100, "其他", 9000)));//student{age=36, name='其他', many=9000}
orElseGet

orElseGet与orElse方法类似,区别在于得到的默认值。orElse方法将传入的字符串作为默认值,orElseGet方法可以接受Supplier接口的实现用来生成默认值。无参有返回值

Optional<Student> s = Optional.ofNullable(null);
System.out.println(s.orElseGet(()->new Student(36, "其他", 9000)));//student{age=36, name='其他', many=9000}
orElseThrow

如果有值则将其返回,否则抛出supplier接口创建的异常。

在orElseGet方法中,我们传入一个Supplier接口。然而,在orElseThrow中我们可以传入一个lambda表达式或方法,如果值不存在来抛出异常。

try{
    Optional<Student> s = Optional.ofNullable(null);
    s.orElseThrow(IllegalArgumentException::new);
}catch (Throwable e){
    System.out.println("error:"+e.getMessage());
}
map

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

map方法用来对Optional实例的值执行一系列操作。通过一组实现了Function接口的lambda表达式传入操作。

String name="asdfg";
        Optional<String> n = Optional.of(name);
        Optional<String> s = n.map(e -> e.toUpperCase());
        if(s.isPresent()){
            String s1 = s.get();
            System.out.println(s1);
        }
flatMap

如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。

flatMap方法与map方法类似,区别在于mapping函数的返回值不同。map方法的mapping函数返回值可以是任何类型T,而flatMap方法的mapping函数必须是Optional。

参照map函数,使用flatMap重写的示例如下:

 String name="asdfg";
        Optional<String> n = Optional.of(name);
        Optional<String> s = n.flatMap(e -> Optional.of(e.toUpperCase()));
        if(s.isPresent()){
            String s1 = s.get();
            System.out.println(s1);
        }
filter

如果有值并且满足断言条件返回包含该值的Optional,否则返回空Optional。

这里可以传入一个lambda表达式。对于filter函数我们应该传入实现了Predicate接口的lambda表达式。

String name="asdfg";
        Optional<String> n = Optional.of(name);
        Optional<String> s = n.filter(e -> e.length()<8);
        if(s.isPresent()){
            String s1 = s.get();
            System.out.println(s1);
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值