如何用Optional.map()重构代码?map方法的参数是什么?
问题解答
先看给定的接口定义:
public interface Vc{ } public interface Vd< P extends Vc, C extends Vcc>{ ... } public interface VcResult extends Vc{ }
还有返回Optional<Vc>类型的方法:
public Optional<Vc> getData()
待优化的逻辑是:当getData()返回的Optional<Vc>为空时,调用anotherMethod()返回结果;不为空时,将内部的Vc实例强转为VcResult返回。要把这段逻辑改写成vc.map()..orElseGet(() -> anotherMethod());的形式,map方法的参数需要实现从Vc到VcResult的类型转换。
正确的map参数写法
有两种简洁的实现方式:
- 使用Lambda表达式:
vc.map(vc -> (VcResult) vc).orElseGet(() -> anotherMethod());
这里的vc -> (VcResult) vc就是map的参数,它负责把Optional中的Vc实例强制转换为VcResult类型。
- 使用方法引用(更简洁):
vc.map(VcResult.class::cast).orElseGet(() -> anotherMethod());
VcResult.class::cast是Java的方法引用语法,作用和上面的Lambda表达式完全一致,都是完成类型强转的操作。
补充说明
因为VcResult是Vc的子接口,这种强转在业务逻辑能确保getData()返回的Vc实际是VcResult实例的前提下是安全的。如果存在类型不匹配的风险,建议在转换前增加类型检查,避免抛出ClassCastException。
内容的提问来源于stack exchange,提问作者Pratim Singha
相关产品推荐
相关产品推荐

