使用谓词查询字段

Using a predicate for a query on a field

我正在研究 lambda 表达式,我正在尝试创建一种通用方法来为字段上的 class 形成谓词。下面是一些代码来说明:

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 才能获取字段?我想我希望方法是 "field-generic"。我猜在这里使用 java 反射不是一个好主意。

您可以让您的方法将一个 Function 和一个 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());
    }
  }