Java中如何结合Optional与ifPresent优雅实现取值并避免if-else
正确实现
不需要写额外的if-else分支,直接把链路里用错的ifPresent替换成map就可以跑通,完整代码如下:
private String getUserName(String id) { return fetchUser(id) .map(User::getName) .orElse("DEFAULT_NAME"); }
原来的fetchUser方法逻辑完全不用改,保持现有的空值封装、异常捕获逻辑就行。
为啥之前的写法不对
ifPresent接收的是Consumer类型的参数,作用只是当Optional有值时执行一段自定义逻辑,方法本身返回void,根本接不上后面的orElse链式调用map方法才是负责做值转换的方法,它接收一个Function类型的转换函数,执行逻辑是:如果当前Optional里有值,就把这个值按你给的函数转换,返回封装了转换结果的新Optional;如果当前Optional是空的,就直接返回一个空的Optional。最后接orElse就能在空值的时候返回默认值,完全贴合需要的逻辑。
可以扩展的用法
如果后续要对拿到的用户名做额外校验或者处理,不需要写if判断,直接在链式调用里加逻辑就行,比如:
return fetchUser(id) .map(User::getName) .map(String::trim) .filter(name -> !name.isBlank()) .orElse("DEFAULT_NAME");
内容的提问来源于stack exchange,提问作者RDM
相关产品推荐
相关产品推荐

