2014-10-02 579 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