我有两个非常相似的方法.所以我想把它简化为一种方法,但我不知道怎么做.

用法如下:

mapClassBToClassA("a list o ClassB objs", "a list of ClassA objs");
mapClassCToClassA("a list o ClassC objs", "a list of ClassA objs");

我想更改为:

mapClassToClassA("a list o ClassB objs", "a list of ClassA objs");
mapClassToClassA("a list o ClassC objs", "a list of ClassA objs");

方法一B = A

public void mapClassBToClassA(List<ClassB> b, List<ClassA> a){
   Comparator<ClassB> sortFunc = Comparator.comparing(ClassB::getDate);
   Collections.sort(b, sortFunc);
   for (ClassA aObj : a){
      LocalDate dateA = aObj.getDate();
      ClassB bObjToUse = null;
      for (ClassB bObj : b){
         LocalDate dateB = bObj.getDate();
         if (dateB.isAfter(dateA)){
            break;
         }
         else {
            bObjToUse = bObj; 
         } 
      }
      if (bObjToUse != null){
         aObj.setClassB(bObjToUse);
      }
   }
}

方法二C = A

public void mapClassCToClassA(List<ClassC> c, List<ClassA> a){
   Comparator<ClassC> sortFunc = Comparator.comparing(ClassC::getDate);
   Collections.sort(c, sortFunc);
   for (ClassA aObj : a){
      LocalDate dateA = aObj.getDate();
      ClassC cObjToUse = null;
      for (ClassC cObj : c){
         LocalDate dateC = cObj.getDate();
         if (dateC.isAfter(dateA)){
            break;
         }
         else {
            cObjToUse = cObj; 
         } 
      }
      if (cObjToUse != null){
         aObj.setClassC(cObjToUse);
      }
   }
}

我想做一些东西,比如:

public void mapClassToClassA(List< **xx** > t, List<ClassA> a){
   Comparator< **xx** > sortFunc = Comparator.comparing( **xx** ::getDate);
   Collections.sort( t , sortFunc);
   for (ClassA aObj : a){
      LocalDate dateA = aObj.getDate();
      **xx** objToUse = null;
      for (**xx** obj : t){
         LocalDate dateT = obj.getDate();
         if (dateT.isAfter(dateA)){
            break;
         }
         else {
            objToUse = bObj; 
         } 
      }
      if (objToUse != null){
         aObj.setClassXXX(objToUse);
      }
   }
}

我试着使用泛型

public <T> void mapToArende(List<T> t, List<ClassA> a){
        ...
           T objToUse = null;

但这样的话:

  • 我不能做比较器,因为这不起作用

    Comparator.comparing(T::getFromdat);
    
  • 而不是调用obj.getDate(),在这里我发现了一个使用反射的解决方案,但人们建议不要这样做.但它很有效.我应该怎么做呢?

    Method m = obj.getClass().getMethod("getDate");
    LocalDate dateT = (LocalDate) m.invoke(obj);
    
  • 我不知道如何调用aObj.setClassXXX

我读过关于lambdas的文章,但看不出如何处理这些问题.

推荐答案

如果你不能给这些类添加一个公共接口,你可以给方法参数添加一些函数:

public <T> void mapClassToClassA(List<T> t, List<ClassA> a,
                                 Function<T, LocalDate> dateGetter,
                                 BiConsumer<ClassA, T> setter) {

    Comparator<T> sortFunc = Comparator.comparing(dateGetter);
    Collections.sort(t, sortFunc);
    for (ClassA aObj : a) {
        LocalDate dateA = aObj.getDate();
        T tToUse = null;
        for (T tObj : t){
            LocalDate dateT = dateGetter.apply(tObj);
            if (dateT.isAfter(dateA)){
                break;
            }
            tToUse = tObj; 
        }
        setter.accept(aObj, tObjToUse);
    }
}

按如下方式调用:

mapClassToClassA(b, a, ClassB::getDate, ClassA::setClassB);
mapClassToClassA(c, a, ClassC::getDate, ClassA::setClassC);

Java相关问答推荐

那么比较似乎不是词典学的,尽管doctor 这么说

找到允许的最大底片

Cucumber TestNG Assert失败,出现java. lang. Numbercycle异常

H2弹簧靴试验跌落台

即使我正在使用并发方法,使用Javascript的应用程序也会继续冻结'

Spring Batch 5-不要让它在数据库中自动创建表

如何配置ActiveMQ Artemis以使用AMQP 1.0和其他协议与Java

将数组整体转换为链接表

Spring和可编辑";where";@Query

使用Jolt将字段转换为列表

从ActiveMQ Classic迁移到ActiveMQ Artemis需要进行哪些客户端更改?

Android Java:已设置但未读取SharedPreferences

舰队运行配置Maven版本

垃圾回收器是否真的删除超出作用域的对象?

带有可选部分的Java DateTimeForMatter

每次我需要时创建和关闭数据库连接会有什么效果吗?

组合连接以从两个表返回数据

如何从命令行编译包中的所有类?

无法在IntStream上应用Collectors.groupingBy

Jackson YAML:支持锚点扩展/覆盖