2014-10-02 56 views
2
List<Y> tmp= new DATA<Y>().findEntities(); 
List<X> tmp1 = new DATA<X>().findEntities().stream().filter(
         IN (tmp) ??? 
       ).collect(Collectors.toList()); 

如何使用謂詞模擬一個典型的IN子句(如在mysql或JPA中)?Java 8流過濾:IN子句

+0

'tmp.contains(實體)'其中'tmp'是一個'HashSet'。 – 2014-10-02 13:25:01

+2

'tmp :: contains'(方法參考) – Seelenvirtuose 2014-10-02 13:26:10

+0

我可以有Predicate(Implemented)例子嗎? – 2014-10-02 13:31:28

回答

3

我決定將我的評論更新爲答案。爲您的要求Predicate<Y>(其中Y應該是一個具體類型)看起來如下的lambda表達式:

element -> tmp.contains(element) 

因爲集合的contains方法具有相同的簽名作謂語的test方法,您可以使用方法參考 (這裏實例方法參考):

tmp::contains 

完整例如:

List<Number> tmp = Arrays.asList(1, 2, 3); 
List<Integer> tmp1 = Arrays 
    .stream(new Integer[] { 1, 2, 3, 4, 5 }) 
    .filter(tmp::contains) 
    .collect(Collectors.toList()); 
System.out.println(tmp1); 

這將打印

[1, 2, 3] 
+0

這會生成一個可疑的調用java.util.Collection.contains(有時) – 2014-10-02 13:39:18

+1

我沒有得到一個_suspicious調用_也沒有編譯器警告。我只是得到了描述的輸出。 – Seelenvirtuose 2014-10-02 13:41:51

+0

謝謝你的幫助。 – 2014-10-02 13:42:23