日常调戏Java:类和对象的函数式实现

  • Post author:
  • Post category:java

定义

static Function<String, ?> defClass() {
    Map<String, Object> map = new HashMap<>();
    return (name) -> { //传入的操作名
        if ("new".equals(name)) { //创建对象
            HashMap<String, Object> objectMap = new HashMap<>(map);
            return (Function) (arg) -> {
                if ("get".equals(arg)) //获取field的内容
                    return (Function) (fieldName) -> objectMap.get(fieldName);
                else if ("set".equals(arg)) //设置field的内容
                    return (Function<String, ?>) (fieldName) -> (Consumer) (value) -> objectMap.put(fieldName, value);
                else if ("invoke".equals(arg)) //调用类的方法
                    return (Function) (methodName) -> objectMap.get(methodName);
                return null;
            };
        } else if ("method".equals(name)) //添加方法
            return (Function<String, ?>) (methodName) -> (Function) (method) -> map.put(methodName, method);
        return null;
    };
}

使用

/* 1. 定义一个类 */
Function<String, ?> aClass = defClass();
/* 2. 给这个类添加一个方法test,打印参数a到控制台 */
((Function) ((Function) aClass.apply("method")).apply("test")).apply((Consumer) a -> System.out.println("test:" + a));
/* 3. 给这个类添加一个方法test2,把参数a和b相加,然后返回*/
((Function) ((Function) aClass.apply("method")).apply("test2")).apply((Function<Integer, ?>) a -> (Function<Integer, ?>) b -> {
    System.out.println("a + b = " + (a + b));
    return a + b;
});
/* 4. 创建该类的对象 */
Function obj = (Function) aClass.apply("new");
/* 5. 调用test方法,参数为3 */
((Consumer) (((Function) obj.apply("invoke")).apply("test"))).accept(3);
/* 6. 调用test2方法,参数为3和5 */
System.out.println("test2:" + ((Function) ((Function) ((Function) obj.apply("invoke")).apply("test2")).apply(3)).apply(5));
/* 7. 设置属性name为XiaoMing */
((Consumer) ((Function) obj.apply("set")).apply("name")).accept("XiaoMing");
/* 8. 读取属性name并打印 */
System.out.println("get name:" + ((Function) obj.apply("get")).apply("name"));

版权声明:本文为zssrxt原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。