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条件,如何避免上面重复的代码?我是否需要使用任何Java 8函数类作为参数以避免重复代码(或)必须使用任何额外的泛型代码?

推荐答案

虽然可以应用泛型方法,但它们无法解决您试图解决的实际场景(在我仔细思考之前,这个答案的早期编辑是一次try ).

退一步讲,这看起来像问题陈述("你在解决什么",而不是"如何解决"):

  • 迭代 map 中的所有列表–在您发布的代码中,这将是:MultiValueMap<String, List> mvm
  • 适应不同的对象类型–您以员工和部门为例
  • 无论列表中包含什么(员工、部门等),您都要拨打getDataElement()

正如Ausgefuchster的另一个答案所描述的那样,这可以通过接口来解决.我投票支持这个答案,但想提供更多

步骤1:定义接口

不管具体的类是什么,你的 map 都包含有getDataElement()个对象的列表,因此制作一个界面来捕捉:

interface HasDataElement {
    String getDataElement();
}

步骤2:类实现接口

为了得到这个答案,我编写了几个简单的类——a、B和C,它们实现了接口,但在调用getDataElement()时只返回一个字符串.在代码中,您将修改员工、部门等以实现新界面.

class A implements HasDataElement {
    @Override
    public String getDataElement() {
        return "A";
    }
}

class B implements HasDataElement {
    @Override
    public String getDataElement() {
        return "B";
    }
}

class C implements HasDataElement {
    @Override
    public String getDataElement() {
        return "C";
    }
}

第三步:处理 map

我使用的是内置类型,所以是Map<String, List>,而不是你发布的使用MultiValueMap<String, List>的代码.我认为这一差异并不显著,但还是指出了这一点.

下面的方法签名指定映射不仅仅是<String, List>,还进一步指定列表本身必须包含扩展HasDataElement接口List<? extends HasDataElement>的内容.

在方法内部,相同的List<? extends HasDataElement>类型显示在第一个循环中.

一旦进入,item的具体类就不相关了——我们知道它符合HasDataElement接口,所以我们可以调用item.getDataElement().

private static void processAllDataElements(Map<String, List<? extends HasDataElement>> map) {
    for (List<? extends HasDataElement> list : map.values()) {
        for (HasDataElement item : list) {
            System.out.println(item.getDataElement());
        }
    }
}

示例用法

下面是一个简单的示例,以及输出,它创建了不同类a、B和C的几个不同列表.然后创建一个映射并将所有三个列表相加.

List<A> listOfA = List.of(new A[]{new A()});
List<B> listOfB = List.of(new B[]{new B(), new B()});
List<C> listOfC = List.of(new C[]{new C(), new C(), new C()});

Map<String, List<? extends HasDataElement>> map = new HashMap<>();
map.put("A", listOfA);
map.put("B", listOfB);
map.put("C", listOfC);

processAllDataElements(map);

A
B
B
C
C
C

Java相关问答推荐

在未跨多次运行重写过go 的数据的情况下将数据写入到SON文件时遇到问题(使用Jackson)

在Java中使用带限制的回归打印星形三角形

无法在Java中使用Curve secp 256 k1验证JWT

Java Swing绘制gif作为多个JSYS和JLabels的背景

是否可以从@ TrustMapping中删除特定方法的基路径?

javafx getHostServices(). showDocument()调出Chrome而不是默认浏览器(Linux)

JDK22执行repackage of goal org. springframework. boot:spring—boot—maven—plugin:3.2.3:repackage failed:unsupported class file major version 66—>

调用引发泛型异常的泛型方法时出现编译错误

在Java中,在单个逻辑行中连接列表和单个元素的正确方法是什么?

匹配一组字符或另一组字符

在Java中将int[]矩阵添加到ArrayList中,但出现错误

为什么StandardOpenOption.CREATE不能通过Ubuntu在中小企业上运行?

我可以在@Cacheable中使用枚举吗

无法将GSON导入到我的JavaFX Maven项目

在Java中将对象&转换为&q;HashMap(&Q)

不能在 map 上移除折线

使用@ExceptionHandler的GlobalExceptionHandler还是来自服务器的REST应答的ResponseEntity?

如何在Spring Boot Auth服务器上正确配置CORS?

java.lang.NoSuchMethodError:';org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream$Builder org.apache.poi-poi-ooxml-5.2.4

Java编译器是否进行了持续的折叠优化,以及如何进行判断?