You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 05:24:04