如何用Java 8 Optional重构多条件OR判断的代码块?
用Java 8 Optional重构你的空值判断代码
嘿,刚接触Java 8的Optional确实容易有点摸不着头脑,我来帮你把这段代码优雅地重构一下~
先回顾下你的原逻辑:调用findObject()获取对象,如果对象是null或者已经被删除,就抛出异常。用Optional可以完全消除显式的null判断,同时让逻辑更清晰。
推荐实现方式(结合filter + orElseThrow)
这是最符合Java 8 Optional设计理念的写法,简洁且易读:
// 直接获取经过校验的对象,不符合条件则抛异常 ClassA objA = Optional.ofNullable(findObject()) // 过滤掉已删除的对象,保留未删除的 .filter(obj -> !obj.isDeleted()) // 如果Optional为空(原对象null或已删除),抛出异常 .orElseThrow(() -> new Exception("Object is not found."));
分步解释每一步:
Optional.ofNullable(findObject()):把findObject()可能返回的null值安全地包装成Optional对象,避免后续的objA == null判断。filter(obj -> !obj.isDeleted()):Optional的filter方法会保留符合条件的对象——只有当对象存在且未被删除时,Optional才会继续持有该对象;如果对象已删除,Optional会变成空。orElseThrow(...):这是Java 8里处理空Optional的常用方法,如果Optional是空的(也就是原对象为null或已删除),就执行传入的Supplier抛出指定异常;如果Optional有值,就直接返回该值。
如果你想结合ifPresent实现(Java 8写法)
虽然不如上面的方式优雅,但如果一定要用到ifPresent,可以这样写:
Optional<ClassA> objAOpt = Optional.ofNullable(findObject()) .filter(obj -> !obj.isDeleted()); // 当对象存在时,执行后续逻辑(这里只是示例,可替换为你的业务操作) objAOpt.ifPresent(obj -> { System.out.println("对象可用,执行操作"); }); // 如果Optional为空,抛出异常 if (!objAOpt.isPresent()) { throw new Exception("Object is not found."); } // 也可以直接获取校验后的对象 ClassA objA = objAOpt.get();
不过这种写法需要额外判断isPresent(),不如orElseThrow简洁,所以更推荐第一种方式。
最后提醒下:Exception是受检异常,你需要在方法上声明throws Exception,或者换成RuntimeException的子类(比如IllegalStateException)来避免受检异常的繁琐处理。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

