Java 对字段的查询使用谓词

Java 对字段的查询使用谓词,java,lambda,functional-programming,predicate,higher-order-functions,Java,Lambda,Functional Programming,Predicate,Higher Order Functions,我正在处理lambdas,我正在尝试创建一种通用方法来为字段上的类形成谓词。下面是一些代码来说明: public class A { private String b; private String c; public A(String b, String c) { this.b = b; this.c = c; } public String getB() { return b; } public String getC() { return c; }

我正在处理lambdas,我正在尝试创建一种通用方法来为字段上的类形成谓词。下面是一些代码来说明:

public class A {

private String b;
private String c;

public A(String b, String c) {
    this.b = b;
    this.c = c;
}

public String getB() {
    return b;
}

public String getC() {
    return c;
}

}

public class Main {

public static void main(String[] args) {
    List<A> list = Arrays.asList(new A("aa","bb"),new A("aaC","bb"));
    Test test = new Test();
    test.setList(list);
    test.createPred("aa");
}

}


public class Test {

private List<A> list;

public void setList(List<A> list) {
    this.list = list;
}

public Predicate<A> createPred(String query) {
    return new Predicate<A>() {
        @Override
        public boolean test(A t) {
            return t.getB().equals(query);
        }
    };
}

public List<A> search(Predicate<A> a) {
    return list.stream().filter(a).collect(Collectors.toList());
}
}

如何编写createPred,以便它可以接受一个字段?我想这个方法应该是字段泛型的。我猜在这里使用java反射不是一个好主意。

您可以让您的方法使用函数和T作为查询字段

  public static void main(String[] args) {
    List<A> list = Arrays.asList(new A("aa", "bb"), new A("aaC", "bb"));
    Test test = new Test();
    test.setList(list);
    test.createPred("aa", A::getB);
  }



  public static class Test {

    private List<A> list;

    public void setList(List<A> list) {
      this.list = list;
    }

    public <T> Predicate<A> createPred(T query, Function<A, T> f) {
      return new Predicate<A>() {
        @Override
        public boolean test(A x) {
          return f.apply(x).equals(query);
        }
      };
    }

    public List<A> search(Predicate<A> a) {
      return list.stream().filter(a).collect(Collectors.toList());
    }
  }

你不能在createPred中将其作为参数传递并在新的谓词体中使用它吗?反射似乎是唯一可能的方法,是的,使用反射通常不是一个好主意。我看到通过反射实现的大多数友好想法最终在问题和维护方面比它们保存的键入成本要高。如果我没弄错的话,你可以在这里使用一个函数。将其放入方法中,然后使用类似于t->t.getB的东西调用该方法,例如createPred…,t->t.getB;。这将允许您在测试方法中输入A的任何字符串字段。@FlorianSchaetz这似乎是最合理的方法。即使它不一定要字段泛化它。@FlorianSchaetz的想法是正确的。但是,如果您可以像Florian的示例那样使用getter而不是字段,那么您可以使它更漂亮一些:createPredt::getB