Java中如何使用BiFunction实现带参getter的ReadFunction封装
实现方案
你想要的调用效果本身已经可以直接运行,以下是不同场景下的实现方式,全程不需要修改原有ReadFunction接口的readValue方法签名:
最简实现:直接使用lambda闭包绑定参数
你示例中给出的写法本身就完全满足要求,核心是利用lambda的闭包特性预先把参数绑定到Function实例中:
// 预配置要取的key为"targetKey",绑定到ReadFunction实例中 ReadFunction<MyObject, String> MAP_VALUE_READ_FNC = new ReadFunction.Impl<>( myObject -> myObject.getValueFromMap("targetKey") ); // 调用时和无参getId的用法完全一致,不需要额外传参 MyObject obj = new MyObject(); String mapValue = MAP_VALUE_READ_FNC.readValue(obj);
小提示:你提供的
MyObject类中getValueFromMap方法的return语句末尾缺少分号,编译前需要补上。
优化方案:新增工厂方法简化不同参数的实例创建
如果需要频繁创建对应不同key的ReadFunction实例,可以在ReadFunction接口中新增静态工厂方法,避免重复手写lambda:
public interface ReadFunction<R , T> { T readValue(R object); class Impl<R, T> implements ReadFunction<R, T> { private final Function<R, T> function; public Impl(final Function<R, T> function) { this.function = function; } @Override public T readValue(final R object) { return this.function.apply(object); } } // 新增静态工厂方法,专门用于创建预绑定key的map取值实例 static ReadFunction<MyObject, String> forMapKey(String preBindKey) { return new Impl<>(myObject -> myObject.getValueFromMap(preBindKey)); } }
调用时更加简洁:
// 一行代码即可创建绑定不同key的实例 ReadFunction<MyObject, String> NAME_READ_FNC = ReadFunction.forMapKey("userName"); ReadFunction<MyObject, String> MOBILE_READ_FNC = ReadFunction.forMapKey("mobile"); // 调用逻辑完全统一 MyObject obj = new MyObject(); String userName = NAME_READ_FNC.readValue(obj); String mobile = MOBILE_READ_FNC.readValue(obj);
通用方案:支持任意单参数getter的绑定
如果需要适配其他类的单参数getter,不限于MyObject的map取值,可以新增通用参数绑定方法:
// 在ReadFunction接口中新增通用绑定方法 static <R, T, P> ReadFunction<R, T> bindParam(Function<R, Function<P, T>> getter, P param) { return new Impl<>(obj -> getter.apply(obj).apply(param)); }
调用时可以适配任意单参数的getter方法:
// 绑定getValueFromMap方法和指定参数 ReadFunction<MyObject, String> MAP_VALUE_READ_FNC = ReadFunction.bindParam( obj -> obj::getValueFromMap, "targetKey" ); // 调用逻辑不变 String value = MAP_VALUE_READ_FNC.readValue(new MyObject());
内容的提问来源于stack exchange,提问作者hello2244
相关产品推荐
相关产品推荐

