【JAVA】Optional优化if判空长龙

Optional

为什么要有这个?

先来看个例子,思考一下会输出null还是报错呢?

public class TestOptional {
    public static void main(String[] args) {
        OptionTest optionTest = new OptionTest();
        System.out.println(optionTest.getInnerParam().getInnerInnerParam().getParam());
    }
}

@Data
class OptionTest{
    private int id;
    private int age;
    private InnerParam innerParam;
}
@Data
class InnerParam{
    private int param;
    private InnerInnerParam innerInnerParam;
}
@Data
class  InnerInnerParam{
    private int param;
    private int superman;
}

输出:

Exception in thread "main" java.lang.NullPointerException
	at com.example.demostudy.kusch.javabase.optional.TestOptional.main(TestOptional.java:18)
Process finished with exit code 1

很明显报错了。

解决这个报错很简单,加判断呗。

public class TestOptional {
    public static void main(String[] args) {
        OptionTest optionTest = new OptionTest();
        InnerParam innerParam = optionTest.getInnerParam();
        if (null!=innerParam){
            InnerInnerParam innerInnerParam = innerParam.getInnerInnerParam();
            if (null!=innerInnerParam){
                System.out.println(innerInnerParam.getParam());
            }
        }
    }
}

@Data
class OptionTest{
    private int id;
    private int age;
    private InnerParam innerParam;
}
@Data
class InnerParam{
    private int param;
    private InnerInnerParam innerInnerParam;
}
@Data
class  InnerInnerParam{
    private int param;
    private int superman;
}

这虽然可以很好的解决,但是如果嵌套层数很深,那你是不是打算写一整页的if判断??

Optional的使用

先看使用

public class TestOptional {
    public static void main(String[] args) {
        OptionTest optionTest = new OptionTest();
        Integer result = Optional.ofNullable(optionTest)
                .map(OptionTest::getInnerParam)
                .map(InnerParam::getInnerInnerParam)
                .map(InnerInnerParam::getSuperman)
                .orElse(999);
        System.out.println(result);
    }
}
@Data
class OptionTest {
    private int id;
    private int age;
    private InnerParam innerParam;
}
@Data
class InnerParam {
    private int param;
    private InnerInnerParam innerInnerParam;
}
@Data
class InnerInnerParam {
    private int param;
    private int superman;
}

输出:

999

Process finished with exit code 0

可以看出这样不仅可以处理处理空指针异常,还可以处理,在没有值的时候所需要返回的结果。

Optional补充

public class OptionalDemo {

    public static void main(String[] args) {
        House house = new House();
        Television tv = new Television();
        tv.setCartoon("cat");
        house.setTelevision(tv);
        Boolean cartoonFlag = true;
        String cartoon = Optional.ofNullable(house)
        		//类中改写Optional包装
                .flatMap(House::getTelevision)
                //没改写Optional包装
                .map(Television::getCartoon)
                //过滤,上述条件都过了,到这判断不能包含cat
                .filter((a) -> !tv.getCartoon().contains("cat"))
                //所有不符合之后要做的事
                .orElseGet(() -> {
                    if (cartoonFlag) {
                        return "niubi";
                    }
                    return "hahaha";
                });
        System.out.println(cartoon);
    }
}

class House {
    private Television television;
    public void setTelevision(Television television) {
        this.television = television;
    }
    public Optional<Television> getTelevision() {
        return Optional.ofNullable(television);
    }
}

class Television {
    private String cartoon;
    public String getCartoon() {
        return cartoon;
    }
    public void setCartoon(String cartoon) {
        this.cartoon = cartoon;
    }
}

注意House类中的getTelevision()方法,直接在实体类中包装optional返回,配合flatMap使用,其实区别不大。

最后附上mapflatMaporElseGet的方法注释图。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值