当前位置: 首页 > 知识库问答 >
问题:

如何避免使用泛型或函数类在代码中重复

邢焱
2023-03-14
private <Y> void meth(
            MyObj ds, MultiValueMap<String, List> mvm, Class<Y> data) {

            

        if(data.isAssignableFrom(Employee.class)) {
            for (Employee rd : (List<Employee>) mvm.get(0).get(1)) {
               
                for (String cName : (List<String>) mvm.get(0).get(0)) {
                    ds.setCellValue((String)rd.getDataElement(cName));
                   
                }
               
            }
        }

        if(data.isAssignableFrom(Department.class)) {
            for (Department rd : (List<Department>) mvm.get(0).get(1)) {
               
                for (String cName : (List<String>) mvm.get(0).get(0)) {
                    ds.setCellValue((String)rd.getDataElement(cName));
                    
                }
               
            }
        }
        
        
        //some more similar if conditions as above
        
}

在上面,我有类似的10个if条件,如何避免上面的重复代码?我需要使用任何Java8个函数类作为参数来避免重复代码(或者)必须使用任何额外的泛型代码吗?

共有1个答案

荣曾笑
2023-03-14

看起来你需要的是继承而不是泛型。在if条件下,始终对对象强制转换并调用相同的方法。因此,您可以做的是定义一个如下所示的界面:

public interface MyInterface {
    String getDataElement(String name);
}

并在你的员工、部门和其他课程中实施。

如果该方法总是做相同的事情,您可以使用默认或抽象类来不总是编写相同的内容:

public interface MyInterface {
    default String getDataElement(String name) {
        //do your thing
        return value;
   }
}
public abstract class MyAbstractClass {
    public String getDataElement(String name) {
        //do your thing
        return value;
   }
}

现在,您可以将方法更改为:

private void meth(MyObj ds, MultiValueMap<String, List> mvm) {
    List<MyInterface> list = (List<MyInterface>) mvm.get(0).get(1));

    for (MyInterface rd : list) {
        List<String> cNames = (List<String>) mvm.get(0).get(0);
        for (String cName : cNames) {
            ds.setCellValue((String) rd.getDataElement(cName));
        }
    } 
}
 类似资料:
  • 使用此类型类将地图转换为case类: 此函数用于隐式获取正确的映射器 它可以用作 但我也希望能够将此函数与 Option[Map[]] 或 Future[Map[]] 或 List[Map[]] 一起使用。所以我使用这样的函子实现了一个泛型函数: 但是现在这个函数必须用作 。 但是,我希望能够将该功能用作 无需指定函子类型。这在某种程度上是可能的吗? Shapeless的懒惰可以用来解决这个问题吗

  • 我有下一个示例代码: 你可以看到id是JSON格式中的一个重复字段,我知道PostgreSQL有一些功能可以避免这个问题,但我找不到。

  • 我有以下课程: 该类包含两个可选值,我想提供所有可能的构造函数排列。第一个版本不初始化任何内容,第二个版本只初始化第一个值,第三个版本只初始化第二个值。 最后一个构造函数是第二个和第三个构造函数的组合。但这是不可能写下来的,因为代码失败了。 是否可以在没有任何代码冗余的情况下(也不调用相同的setter方法)编写最后一个构造函数?

  • 问题内容: 我不知道如何在不使用或的情况下有效解决以下问题: 当一个元素发生故障时,如何恢复堆不变式? 换句话说,更新中至,并保持工作。您可以假设堆中只有一个。功能定义如下: 这是我的真实情况,如果您有兴趣请阅读。 您可以想象它是一个小的自动完成系统。我需要计算单词的频率,并保持前k个最大数量的单词,这些单词随时准备输出。所以我用在这里。当一个单词计数++时,如果它在堆中,我需要对其进行更新。 所

  • 问题内容: 我在一个项目中工作,在该项目中,我们有多个域类来对业务数据进行建模。这些类是简单的POJO,我必须使用它们显示几个表。例如,考虑此类: 然后,我创建了自己的表模型,该表模型从AbstractTableModel扩展,以便直接与类一起使用: 到目前为止,一切都很好。但是,此方法至少有两个问题: 由于我必须为每个类实现一个表模型,因此我将生成大量重复代码以实质上完成三件事:定义适当的表头,

  • Lodash castArray函数没有任何特殊之处。有没有什么方法可以在没有任何外部库的情况下,利用最新的语言功能解决这个问题,但时间很短? 如果您不熟悉该任务: 有没有办法在没有类型检查的情况下做到这一点?请注意,我寻找最短的等效物ES6。