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

基于类型的Java调用方法

许承悦
2023-03-14

我正在制作一个Java类,在这个类中,我可以用DTO对列表应用一个过滤器(searchterms)。筛选器如下所示:

[{ field: "price", value: "10.0" }, { field: "name", value: "%phone%" }]

在我的类中,我有以下方法,将所有筛选器应用到列表:

    public List<T> applyFilters(List<T> input, ArrayList<LinkedHashMap<String, String>> searchTerms) {
    for (LinkedHashMap<String, String> searchTerm : searchTerms) {
        input = input.stream()
                .filter(row -> {
                    try {
                        return applySingleFilter(row, searchTerm);
                    } catch (Exception e) {
                        throw new CustomGraphQLException(400, "The filter field is not a valid field in this type");
                    }
                })
                .collect(Collectors.toList());
    }

    return input;
}

但是applysinglefilter根据字段的类型有不同的实现。与字符串类似,我创建了一个正则表达式:

    private boolean applySingleStringFilter (T category, LinkedHashMap<String, String> searchTerm) throws Exception {
    String patternString = createCompareRegex(searchTerm.get("value"));

    String propertyValue = (String) PropertyUtils.getProperty(category, searchTerm.get("field"));
    return propertyValue.matches(patternString);
}

但就像一个Float我想要另一个比较,我不想应用正则表达式到一个Float。要确保根据字段的类型调用正确的方法,最好的方法是什么?

共有1个答案

薛高澹
2023-03-14

首先需要知道字段的类型,一旦有了这些信息,就可以维护应用于该类型的筛选器的存储库(但可能需要进行一些转换)。

我们有一个类似的系统,本质上是这样的:

interface Filter<T> {
  Class<T> getHandledType();
  boolean apply(T element);
}

class DoubleFilter implements Filter<Double> {
   public Class<Double> getHandledType() { return Double.class; }
   boolean apply(Double element) {
     //filter here
   }
}

存储库基本上是一个映射 、filter<?>> ,使用它的方式如下:

 Object fieldValue = //get the field value;
 Class<?> fieldType = fieldValue.getClass(); //ofc, check for null first
 Filter<?> filter = repo.get(fieldType);
 if( filter != null ) {
   //nasty cast to a raw type to tell the compiler to allow the call
   ((Filter)filter).apply(fieldValue);
 }
 类似资料:
  • 我有一个现有的C#泛型类,希望根据使用的类型添加或删除一个方法,我解释道 对于特定的

  • 问题内容: 我想知道用这样的签名调用静态方法的正确方法是什么: 由于某种原因,我很想这样称呼它: 但是除非我将其更改为:否则它不会编译: 我只是想知道为什么它不需要右侧的提示。而是给了我编译错误。它说它期望在右侧的提示后加上分号。第二个方法是调用该方法的正确方法吗?有人可以给我一些启示吗? 问题答案: 如图所示这里,要调用的方法的方法是: 该方法所在的类的名称在哪里。

  • 下面的代码来自一个名为ButterKnife的Android库。我正在弄清楚它是怎么工作的。 我试图重新创建此函数的行为: 和用法: 但是异常并非永远不会被捕获,而是在调用方法时在行中抛出。为什么? 还有,这到底是如何工作的?该方法如何知道要转换到什么?

  • 问题内容: 我正在寻找此代码将输出: 但是我得到了: 我了解在B的上下文中,A.f1(String)中的“ this”是B的实例。我是否可以选择执行新的链B1()。f1(String)->(A’s)f1(String)->(A’s)f1(int,String)? 这是一个理论问题,实际上,解决方案显然是在A中实现f1(String)和f1(int,String)都将调用的私有函数。 谢谢你, 马克

  • 问题内容: 在JavaScript中,每个对象同时是一个实例和一个类。要进行继承,可以将任何对象实例用作原型。 在Python,C ++等中,有类和实例作为单独的概念。为了进行继承,您必须使用基类创建一个新类,然后可以使用该新类来生成派生实例。 为什么JavaScript朝这个方向发展(基于原型的面向对象)?与传统的基于类的OO相比,基于原型的OO有哪些优点和缺点? 问题答案: 这里大约有一百个术

  • 问题内容: 我正在用Java编写一个Kafka流应用程序,该应用程序将接受由连接器创建的输入主题,该连接器将模式注册表和avro用于键和值转换器。连接器产生以下架构: 实际上,有几个主题,键模式始终是“ int”,而值模式始终是某种记录(用户,产品等)。我的代码包含以下定义 最初,我尝试使用类似的内容来使用该主题, Consumed.with(Serdes.Integer(), userSerde