【Java】方法引用对象

方法引用对象

package com.yitong.sny.common.utils.pageutil;

import java.util.ArrayList;
import java.util.List;

/**
 * 方法引用对象
 *
 * <p>用于接收方法的引用</p>
 * <p>
 * 示例:
 * <pre><code>
 * FuncObject.Param3<Object, Object, Object, Object> param3 = (a, b, c) -> {
 *     return String.format("%s %s %s %n", a, b, c);
 * };
 * </code></pre>
 *
 * @author zhangxuetu
 * @date 2023-01-05
 */
public class FuncObject {


    public static void main(String[] args) {
        // 测试
        Param3<Object, Object, Object, Object> param3 = (a, b, c) -> {
            return String.format("%s %s %s %n", a, b, c);
        };
        System.out.println(param3.apply("1", "2", "3"));

    }

    /**
     * 生成参数接口方法
     */
    public static void generateParamsInterface() {
        // 执行生成代码
        String template = "\t@FunctionalInterface\n" +
                "\tpublic interface Param%s<%s> {\n" +
                "\t\tR apply(%s);\n" +
                "\t}\n\n";

        int maxParamsCount = 20;

        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i <= maxParamsCount; i++) {
            List<String> generic = new ArrayList<>();
            for (int j = 1; j <= i; j++) {
                generic.add("P" + j);
            }
            generic.add("R");
            List<String> params = new ArrayList<>();
            for (int j = 1; j <= i; j++) {
                params.add("P" + j + " var" + j);
            }
            stringBuilder.append(String.format(
                    template, i,
                    String.join(",", generic),
                    String.join(",", params)
            ));

        }

        System.out.println(stringBuilder);

    }

    //==============================================================
    //       通过引用的方法获取对应数据(其他类里拷贝使用下面的两个生成方法)
    //==============================================================

    public static void generateGetPageInfo() {
        String template = "    public static <T, %s> PageInfo<T> getPageInfo(%s.%s<%s> key, List<T> list) {\n" +
                "        PageInfo<T> pageInfo = (PageInfo<T>) pageInfoMap.get(key);\n" +
                "        pageInfo.setList(list);\n" +
                "        return pageInfo;\n" +
                "    }\n\n";

        String functionInterfaceName = "FunctionInterfaces";

        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i <= 20; i++) {
            List<String> genericList = new ArrayList<>();
            for (int j = 1; j <= i; j++) {
                genericList.add("P" + j);
            }
            genericList.add("R");

            String interfaceName = "Param" + i;
            String generic = String.join(", ", genericList);
            String code = String.format(template, generic, functionInterfaceName, interfaceName, generic);

            stringBuilder.append(code);
        }

        System.out.println(stringBuilder);

    }


    public static void generateRecordPageInfo() {

        String template = "    public static <T, %s> void recordPageInfo(%s.%s<%s> key, List<T> list) {\n" +
                "        PageInfo<T> pageInfo = new PageInfo<>(list);\n" +
                "        pageInfoMap.put(key, pageInfo);\n" +
                "    }\n\n";

        String functionInterfaceName = "FunctionInterfaces";

        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i <= 20; i++) {
            List<String> genericList = new ArrayList<>();
            for (int j = 1; j <= i; j++) {
                genericList.add("P" + j);
            }
            genericList.add("R");

            String interfaceName = "Param" + i;
            String generic = String.join(", ", genericList);
            String code = String.format(template, generic, functionInterfaceName, interfaceName, generic);

            stringBuilder.append(code);
        }

        System.out.println(stringBuilder);

    }


    //==============================================================
    //       接口方法
    //==============================================================

    @FunctionalInterface
    public interface Param0<R> {
        R apply();
    }

    @FunctionalInterface
    public interface Param1<P1, R> {
        R apply(P1 var1);
    }

    @FunctionalInterface
    public interface Param2<P1, P2, R> {
        R apply(P1 var1, P2 var2);
    }

    @FunctionalInterface
    public interface Param3<P1, P2, P3, R> {
        R apply(P1 var1, P2 var2, P3 var3);
    }

    @FunctionalInterface
    public interface Param4<P1, P2, P3, P4, R> {
        R apply(P1 var1, P2 var2, P3 var3, P4 var4);
    }

    @FunctionalInterface
    public interface Param5<P1, P2, P3, P4, P5, R> {
        R apply(P1 var1, P2 var2, P3 var3, P4 var4, P5 var5);
    }

    @FunctionalInterface
    public interface Param6<P1, P2, P3, P4, P5, P6, R> {
        R apply(P1 var1, P2 var2, P3 var3, P4 var4, P5 var5, P6 var6);
    }

    @FunctionalInterface
    public interface Param7<P1, P2, P3, P4, P5, P6, P7, R> {
        R apply(P1 var1, P2 var2, P3 var3, P4 var4, P5 var5, P6 var6, P7 var7);
    }

    @FunctionalInterface
    public interface Param8<P1, P2, P3, P4, P5, P6, P7, P8, R> {
        R apply(P1 var1, P2 var2, P3 var3, P4 var4, P5 var5, P6 var6, P7 var7, P8 var8);
    }

    @FunctionalInterface
    public interface Param9<P1, P2, P3, P4, P5, P6, P7, P8, P9, R> {
        R apply(P1 var1, P2 var2, P3 var3, P4 var4, P5 var5, P6 var6, P7 var7, P8 var8, P9 var9);
    }

    @FunctionalInterface
    public interface Param10<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, R> {
        R apply(P1 var1, P2 var2, P3 var3, P4 var4, P5 var5, P6 var6, P7 var7, P8 var8, P9 var9, P10 var10);
    }

    @FunctionalInterface
    public interface Param11<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, R> {
        R apply(P1 var1, P2 var2, P3 var3, P4 var4, P5 var5, P6 var6, P7 var7, P8 var8, P9 var9, P10 var10, P11 var11);
    }

    @FunctionalInterface
    public interface Param12<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, R> {
        R apply(P1 var1, P2 var2, P3 var3, P4 var4, P5 var5, P6 var6, P7 var7, P8 var8, P9 var9, P10 var10, P11 var11, P12 var12);
    }

    @FunctionalInterface
    public interface Param13<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, R> {
        R apply(P1 var1, P2 var2, P3 var3, P4 var4, P5 var5, P6 var6, P7 var7, P8 var8, P9 var9, P10 var10, P11 var11, P12 var12, P13 var13);
    }

    @FunctionalInterface
    public interface Param14<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, R> {
        R apply(P1 var1, P2 var2, P3 var3, P4 var4, P5 var5, P6 var6, P7 var7, P8 var8, P9 var9, P10 var10, P11 var11, P12 var12, P13 var13, P14 var14);
    }

    @FunctionalInterface
    public interface Param15<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, R> {
        R apply(P1 var1, P2 var2, P3 var3, P4 var4, P5 var5, P6 var6, P7 var7, P8 var8, P9 var9, P10 var10, P11 var11, P12 var12, P13 var13, P14 var14, P15 var15);
    }

    @FunctionalInterface
    public interface Param16<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16, R> {
        R apply(P1 var1, P2 var2, P3 var3, P4 var4, P5 var5, P6 var6, P7 var7, P8 var8, P9 var9, P10 var10, P11 var11, P12 var12, P13 var13, P14 var14, P15 var15, P16 var16);
    }

    @FunctionalInterface
    public interface Param17<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16, P17, R> {
        R apply(P1 var1, P2 var2, P3 var3, P4 var4, P5 var5, P6 var6, P7 var7, P8 var8, P9 var9, P10 var10, P11 var11, P12 var12, P13 var13, P14 var14, P15 var15, P16 var16, P17 var17);
    }

    @FunctionalInterface
    public interface Param18<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16, P17, P18, R> {
        R apply(P1 var1, P2 var2, P3 var3, P4 var4, P5 var5, P6 var6, P7 var7, P8 var8, P9 var9, P10 var10, P11 var11, P12 var12, P13 var13, P14 var14, P15 var15, P16 var16, P17 var17, P18 var18);
    }

    @FunctionalInterface
    public interface Param19<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16, P17, P18, P19, R> {
        R apply(P1 var1, P2 var2, P3 var3, P4 var4, P5 var5, P6 var6, P7 var7, P8 var8, P9 var9, P10 var10, P11 var11, P12 var12, P13 var13, P14 var14, P15 var15, P16 var16, P17 var17, P18 var18, P19 var19);
    }

    @FunctionalInterface
    public interface Param20<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16, P17, P18, P19, P20, R> {
        R apply(P1 var1, P2 var2, P3 var3, P4 var4, P5 var5, P6 var6, P7 var7, P8 var8, P9 var9, P10 var10, P11 var11, P12 var12, P13 var13, P14 var14, P15 var15, P16 var16, P17 var17, P18 var18, P19 var19, P20 var20);
    }


}

发表评论