如何将Java 8中的多条件if-else语句精简为更优雅的代码?
优雅重构Java 8的多分支null判断代码
嘿,这个场景太常见了!你这段链式if-else虽然逻辑清晰,但确实显得冗长,用Java 8的Optional和Stream可以轻松把它变得更简洁、更具声明式风格。
先回顾下你的原代码:
if(valueString != null) { return valueString; } else if(valueInt != null) { return String.valueOf(valueInt); } else if(valueFloat != null) { return String.valueOf(valueFloat); } else if(valueDate != null){ return String.valueOf(valueDate); } else if(valueBit != null) { return String.valueOf(valueBit); } else { return null; }
方案1:用Stream处理候选值(推荐,扩展性好)
我们可以把每个可能的非null值包装成Optional<String>的提供者,然后用Stream找到第一个存在的结果:
return Stream.<Supplier<Optional<String>>>of( () -> Optional.ofNullable(valueString), () -> Optional.ofNullable(valueInt).map(String::valueOf), () -> Optional.ofNullable(valueFloat).map(String::valueOf), () -> Optional.ofNullable(valueDate).map(String::valueOf), () -> Optional.ofNullable(valueBit).map(String::valueOf) ) .map(Supplier::get) .filter(Optional::isPresent) .findFirst() .flatMap(Function.identity()) .orElse(null);
这里的好处是:
- 逻辑一目了然,所有候选值的处理规则都列在一处
- 后续要新增判断分支,直接在
Stream.of里加一行即可,不用改嵌套结构 - 完全符合Java 8的函数式编程风格
方案2:Optional链式调用(更直白)
如果你觉得Stream的写法有点抽象,也可以用Optional的orElseGet链式调用,逻辑和原代码更接近,但更简洁:
return Optional.ofNullable(valueString) .orElseGet(() -> Optional.ofNullable(valueInt).map(String::valueOf).orElse(null)) .orElseGet(() -> Optional.ofNullable(valueFloat).map(String::valueOf).orElse(null)) .orElseGet(() -> Optional.ofNullable(valueDate).map(String::valueOf).orElse(null)) .orElseGet(() -> Optional.ofNullable(valueBit).map(String::valueOf).orElse(null));
这种写法保留了原代码的线性判断顺序,每个orElseGet只会在前面的结果为null时才执行,避免了不必要的计算。
额外小提示
如果这些valueXxx变量是某个对象的不同字段,还可以考虑用方法引用进一步简化,但如果是独立变量的话,上面两种方案就足够优雅了。
内容的提问来源于stack exchange,提问作者user1501171
相关产品推荐
相关产品推荐

