Problem

我试图设计两种过滤列表的方法

public List<TypeA> filter(List<TypeA> typeAList) { 
    //duplicated code
    //filter typeAList using some parameters in typeA objects
    //return filtered list
}

public List<TypeB> filter(List<TypeB> typeBList) { 
    //duplicated code
    //filter typeBList using some parameters in typeB objects 
    //return filtered list
}

问题是这两种方法都有重复的代码,除了过滤部分,我在那里访问TypeA和TypeB中的不同参数.

Things I tried so far

  • 我试着做一个这样的通用方法.但这并不支持

public <T> List<T> filter(List<T> genericList) {
    //duplicated code 
    if (T instanceOf TypeA) 
        //filtering code for TypeA 
    if (T instanceOf TypeB) 
        //filtering code for TypeB 
    //return filtered list 
}
  • 使用两个调用私有泛型筛选方法的方法重载.我
public List<TypeA> filter(List<TypeA> typeAList) {     
    //call innerFilter(typeAList)
}

public List<TypeB> filter(List<TypeB> typeBList) { 
    //call innerFilter(typeBList)
}

private <T> List<T> innerFilter(List<T> genericList) {
   //duplicated code
    if (T instanceOf TypeA)
        //filtering code for TypeA
    if (T instanceOf TypeB)
        //filtering code for TypeB
    //return filtered list
}
  • 试图让这两个类实现一个公共接口并使用

Help needed

我对设计真的很陌生.我想知道我的推理是否正确.也在寻找解决这个问题的最佳替代方法的建议.提前谢谢.

推荐答案

这正是Predicate<T>功能接口要解决的问题类型.

import java.util.List;
import java.util.function.Predicate;

public class SOQ_20220501
{

   public static void main(String[] args)
   {
   
      record TypeA(int a) {}
   
      record TypeB(boolean b) {}
      
      final List<TypeA> as = List.of(new TypeA(0), new TypeA(1), new TypeA(2), new TypeA(3), new TypeA(4));
      
      final List<TypeB> bs = List.of(new TypeB(true), new TypeB(false));
      
      var whateverA = filter(as, typeA -> typeA.a() % 2 == 1);
      
      System.out.println(whateverA);
   
      var whateverB = filter(bs, typeB -> typeB.b());
      
      System.out.println(whateverB);
   
   }

   public static <T> List<T> filter(List<T> typeAList, Predicate<T> predicate)
   {
   
      return
         typeAList.stream()
            .filter(predicate)
            .toList()
            ;
   
   }

}

Java相关问答推荐

为什么接口中的主函数而不是类中的主函数在Java 17中编译和运行没有问题?

如果给定层次 struct 级别,如何从其预序穿越构造n元树

ApachePOI:不带换行的新行

Java记录的不同序列化/反序列化

在Java中,如何按一个属性升序,然后按另一个属性降序对对象列表进行排序?

如何在Java中从XML中获取特定的 node ,然后将其删除?

Bean定义不是从Spring ApplationConext.xml文件加载的

按属性值从流中筛选出重复项

使用Jolt将字段转换为列表

Spring Boot&;Docker:无法执行目标org.springframework.boot:spring-boot-maven-plugin:3.2.0:build-image

Regex以查找不包含捕获组的行

一对多关系和ID生成

如何在运行docker的应用程序中获取指定的配置文件

为什么mvn编译生命周期阶段不只是编译已更改的java文件?

如何利用OpenTelemeter将初始值(零)输出到普罗米修斯

按长度排序字符串数组

如何使JOOQ渐变脚本不重新创建表未更改的类?

在数组中查找素数时出现逻辑错误

Java泛型方法重载

将在 Docker 中运行的 Spring Boot 连接到在 Docker 中运行的 PostgreSQL,无需 compose 文件?