Optional 使用方法

Java8引入了Optional类来解决NullPointerException的问题。学习好Optional的使用方式,使我们的代码更加健壮。
示例类:

class Insurance {
    private String name;
    public String getName() {
        return name;
    }
}
class Car {
    private Optional<Insurance> insurance;
    public Optional<Insurance> getInsurance() {
        return insurance;
    }
}
public class Person {
    private Optional<Car> car;
    public Optional<Car> getCar() {
        return car;
    }
}

1.创建Optional对象

1.1 声明一个空Optional
Optional<Car> optCar = Optional.empty();
1.2 依据一个非空值创建Optional
Car car = new Car();
Optional<Car> optCar2 = Optional.of(car);
1.3 可接受null的Optional
Car car2 = null;
Optional<Car> optCar3 = Optional.ofNullable(car2);

2. 从Optional对象中提取和转换值

Insurance insurance = new Insurance();
Optional<Insurance> optInsurance = Optional.ofNullable(insurance);
Optional<String> name = optInsurance.map(Insurance::getName);
System.out.println(name);
// output
// Optional.empty

3. 在Optional对象中flatMap的使用方式

Optional<Person> person1 = Optional.ofNullable(person);
        String insuranceName = person1.flatMap(Person::getCar)
        .flatMap(Car::getInsurance)
        .map(Insurance::getName)
        .orElse("Unknown");

4. 序列化遇到的问题

在程序中使用了某些要求序列化的库或者框架,在域模型中使用Optional,有可能引发应用程序故障。这是由于Optional类设计时就没有特别考虑将其作为类的字段使用,所以它也并未实现Serializable接口

5. filter的用法

Insurance insurance = new Insurance();
        Optional<Insurance> optInsurance = Optional.ofNullable(insurance);
optInsurance.filter(ins->"example".equals(ins.getName()))
                .ifPresent(x->System.out.println("OK"));

基础类型的Optional对象(OptionalInt、OptionalLong及OptionalDouble),避免使用,因为基础类型的Optional不支持map、flatMap以及filter方法

6 Optional的实战中的用法

6.1 用Optional封装可能为null的值
Optional<Object> value = Optional.ofNullable(map.get("key"));
6.2 异常与Optional的对比
public static Optional<Integer> stringToInt(String s) {
        try {
            return Optional.of(Integer.parseInt(s));
        } catch (NumberFormatException e) {
            e.printStackTrace();
            return Optional.empty();
        }
    }
6.3 Optional整合
Optional.ofNullable(props.getProperty(name))
        .flatMap(OptionalUtils::stringToInt)
        .filter(i -> i>0)
        .orElse(0);

7 Optional类的用法

方法描述
empty返回一个空的Optional实例
filter如果值存在并且满足提供的谓词,就返回包含该值的Optional对象;否则返回一个空的Optional对象
flatMap如果值存在,就对该值执行提供的mapping函数调用,返回一个Optional类型的值,否则就返回一个空的Optional对象
get如果值存在,就将被Optional封装的值返回,否则抛出一个NoSuchElementException异常
ifPresent如果值存在,就执行使用该值的方法调用,否则什么也不做
isPresent如果值存在就返回true,否则返回false
map如果值存在,就对该值执行提供的mapping函数调用
of将指定用Optional封装之后返回,如果该值为null,则抛出一个NullPointerException异常
ofNullable将指定值用Optional封装之后返回,如果该值为null,则返回一个空的Optional对象
orElse如果有值则将其返回,否则返回一个默认值
orElseGet如果有值则将其返回,否则返回一个由指定的Supplier接口生成的值
orElseThrow如果有值则将其返回,否则抛出一个由指定的Supplier接口生成的异常
OptionalJava 8引入的一个类,用于解决空指针异常的问题。它可以包装一个可能为空的值,并提供了一些方法来处理这个值。下面是Optional用法: 1. 创建Optional对象: - 使用`Optional.of(value)`方法创建一个包含非空值的Optional对象。 - 使用`Optional.empty()`方法创建一个空的Optional对象。 - 使用`Optional.ofNullable(value)`方法创建一个包含可能为空值的Optional对象。 2. 判断Optional对象是否包含值: - 使用`isPresent()`方法判断Optional对象是否包含非空值。 - 使用`isEmpty()`方法判断Optional对象是否为空。 3. 获取Optional对象的值: - 使用`get()`方法获取Optional对象中的值,如果Optional对象为空,则会抛出NoSuchElementException异常。 - 使用`orElse(defaultValue)`方法获取Optional对象中的值,如果Optional对象为空,则返回默认值defaultValue。 - 使用`orElseGet(supplier)`方法获取Optional对象中的值,如果Optional对象为空,则通过supplier提供的函数生成一个默认值。 - 使用`orElseThrow(exceptionSupplier)`方法获取Optional对象中的值,如果Optional对象为空,则抛出由exceptionSupplier提供的异常。 4. 处理Optional对象的值: - 使用`ifPresent(consumer)`方法Optional对象中的值进行处理,如果Optional对象非空,则执行consumer提供的操作。 - 使用`map(mapper)`方法Optional对象中的值进行映射转换,返回一个新的Optional对象。 - 使用`flatMap(mapper)`方法Optional对象中的值进行映射转换,返回一个新的Optional对象,但是如果mapper返回的是Optional对象,则不会嵌套包装。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值