在字段上使用谓词进行查询



我正在与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());
    }
  }