如何使用Java的Optional重构空值判断的if条件
使用Java Optional重构懒加载代码
原代码是典型的懒加载逻辑:当全局变量为空时,调用void方法完成赋值,再返回变量。以下是基于Optional的两种重构方案:
方案一:保留原loadListValues方法(返回void)
直接用Optional.ofNullable包装全局变量,通过orElseGet在变量为空时执行加载逻辑:
// 类的全局变量 public List<String> listValues; public List<String> getAllValues() { return Optional.ofNullable(listValues) .orElseGet(() -> { loadListValues(); return listValues; }); } public void loadListValues() { listValues = Arrays.asList("STR1", "STR2", "STR3"); }
逻辑说明
Optional.ofNullable(listValues):将可能为null的全局变量包装为Optional对象orElseGet(Supplier):当Optional为空(即listValues为null)时,执行传入的Supplier逻辑——调用loadListValues完成赋值,再返回赋值后的listValues;若Optional不为空,则直接返回原有值
方案二:修改loadListValues返回值(可选优化)
如果允许修改loadListValues的返回类型,可让其直接返回初始化后的列表,代码会更简洁:
// 类的全局变量 public List<String> listValues; public List<String> getAllValues() { listValues = Optional.ofNullable(listValues) .orElseGet(this::loadListValues); return listValues; } public List<String> loadListValues() { return Arrays.asList("STR1", "STR2", "STR3"); }
逻辑说明
这里orElseGet直接接收loadListValues的方法引用,当listValues为空时,调用该方法获取初始化后的列表并赋值给全局变量,最后返回变量值。这种写法更贴合Optional的设计意图,避免在Supplier中额外处理赋值逻辑。
补充注意
如果代码运行在多线程环境下,建议给全局变量listValues添加volatile关键字,避免出现可见性问题。
内容的提问来源于stack exchange,提问作者CodingIntern
相关产品推荐
相关产品推荐

