0

我正在搞亂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反射不是一個好主意。

+0

難道你不能只是將它作爲'createPred'中的一個參數傳遞並在你的''new Predicate''中使用它? – Nathan

+0

反思似乎是唯一可能的方式,是的,使用反思通常不是一個好主意(大多數我通過反思實現的「和藹可親」的想法最終在問題和維護上比在節省的輸入方面花費更多)。 – SJuan76

+3

如果我找到你的話,你可以在這裏使用'Function '。把它放到你的方法中,然後用't - > t.getB()'來調用方法,例如'createPred(「...」,t - > t.getB());'。這將允許您將任何A字符串字段賦予測試方法。 –

回答

1

你可以讓你的方法把一個函數和一個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()); 
    } 
    }