Java 如何根据方法参数更改代码? publicstaticvoidcalculate(列表数据、字符串类别类型){ 对于(int i=0;i

Java 如何根据方法参数更改代码? publicstaticvoidcalculate(列表数据、字符串类别类型){ 对于(int i=0;i,java,methods,Java,Methods,如果看到data.get(i).calculateCategoryOne(),则方法调用是针对类别1的。问题是,我需要将每个类别的整个代码复制粘贴到if块中,以便只更改此方法调用data.get(I).calculateCategoryTwo(),data.get(I).calculateCategoryThree()data.get(i).calculateCategoryTen() 虽然我仍然可以用这种方式使逻辑工作,但我觉得这是多余的,不是一个好的编程实践。只需更改一行代码,我就必须将同一

如果看到
data.get(i).calculateCategoryOne()
,则方法调用是针对类别1的。问题是,我需要将每个类别的整个代码复制粘贴到if块中,以便只更改此方法调用
data.get(I).calculateCategoryTwo()
data.get(I).calculateCategoryThree()
data.get(i).calculateCategoryTen()

虽然我仍然可以用这种方式使逻辑工作,但我觉得这是多余的,不是一个好的编程实践。只需更改一行代码,我就必须将同一代码复制十次,这将添加近500行代码

所以,我的问题是:是否有一种方法可以基于category类型字符串参数动态更改我的方法调用

我在想一种可能的方法是以字符串形式传递方法调用,并将其转换为方法调用本身。例如,假设CategoryType字符串参数是
“calculateCategoryOne()”
。因此,
data.get(i)。“calculateCategoryOne()”
将被编译器识别为方法调用本身。有没有一种方法可以真正实现这一点


我也愿意接受其他减少冗余的想法。

我认为在这里使用功能接口是合适的。根据categoryType的不同,您需要不同的功能,因此传入您想要使用的函数,而不是它的字符串表示,就可以实现这一点

public static void calculate(List<Person> data, String categoryType) {
       for(int i = 0; i < categoryData.size(); i++) {
            if(data.get(i).calculateCategoryOne() == firstPlace) { 
                 ...
            }
        }

}
或者,如果这种情况经常发生,您可以预先定义一次您的类别并将其传入:

        calculate(list, p -> {
            // calculation done here
            
        });

您可以使用反射,但可能不使用。如果唯一的改变是调用哪个方法,它可以被抽象成另一个方法,或者移动到任何
数据中,我不知道为什么你需要剪切和粘贴整个代码块。get(I)
返回,或者…你的方法
calculateCategoryOne()
做什么,它返回什么?什么是
firstPlace
,与参数
categoryType
有什么关系,您至少在代码段中没有使用该参数?一般来说,你想要实现什么?为什么你的类
Person
有十种不同的方法来做同样的事情?
        calculate(list, p -> {
            // calculation done here
            
        });
Calculate categoryOne = p -> { ... };
Calculate categoryTwo = p -> { ... };
.
.
calculate(list, categoryOne);