Java8流-将方法传递给筛选器

Java8流-将方法传递给筛选器,java,java-8,java-stream,Java,Java 8,Java Stream,我有一组整数set2和一个对象: public class Bucket { private Integer id; private Set<Integer> set1; ... } 公共类存储桶{ 私有整数id; 专用集set1; ... } 我想使用流过滤桶,但只过滤集1与另一集2相交的桶。我尝试了以下代码: Set<Bucket> selectedBuckets = allBuckets.stream() .filter(e ->

我有一组整数set2和一个对象:

public class Bucket {
    private Integer id;
    private Set<Integer> set1;
...
}
公共类存储桶{
私有整数id;
专用集set1;
...
}
我想使用流过滤桶,但只过滤集1与另一集2相交的桶。我尝试了以下代码:

Set<Bucket> selectedBuckets = allBuckets.stream()
    .filter(e -> Sets.intersection(e.getSet1(), set2).size()>1)
    .collect(Collectors.toSet());
Set selectedbucket=allbucket.stream()
.filter(e->set.intersection(e.getSet1(),set2).size()>1)
.collect(收集器.toSet());

但这将返回AllBucket的所有元素,而不是仅返回其集合包含交集的元素。我该怎么做

假设您的意思是与
列表中的任何其他
相交(集合
set1内容),那么您可能只是在寻找什么:

List allbucket=new ArrayList();//如你所愿
Set selectedbucket=allbucket.stream()
.filter(e->allbucket.stream()
.过滤器(f->f!=e)
.flatMap(b->b.getSet1().stream())
.anyMatch->e.getSet1().contains(s)))
.collect(收集器.toSet());

我发现了错误。实际上,我试图用整数而不是对象桶来重现,比如:

Set<Integer> set1 = new HashSet<>();
  set1.add(1);
  set1.add(2);
  set1.add(3);
  set1.add(4);

Set<Integer> set2 = new HashSet<>();
  set2.add(2);
  set2.add(3);
  set2.add(5);
  set2.add(6); 

Set<Integer> relevantBuckets = set1.stream()
            .filter(e -> Sets.intersection(set1, set2).size()>0)
            .collect(Collectors.toSet());

System.out.println(relevantBuckets);
打印:[桶[id=1]]


我考虑过删除这个问题,但由于社区可以从中受益,我决定回答问题本身,而不是编辑

为什么它会返回
所有bucket
的所有元素?它只会返回其
set1
字段与
set2
至少有2个相同值的存储桶。您能否提供一个完整的、可运行的示例代码,以便我们可以在我们的环境中轻松复制?澄清一下,您的意思是
Set
列表中的任何其他
存储桶的交叉点吗?@Andreas您是对的,它正在工作。我的错误是试图用整数重现这个例子。使用我在这里描述的对象很好。无论如何,谢谢。
equals
实现在
Bucket
中进行比较。@Digao我想说它的运行时复杂度是
O(M*N)
其中
M
allbucket
的大小,
N
是流的大小,而不是当前Bucket。目前,还不确定是否会比这更好。
Set<Integer> set1 = new HashSet<>();
  set1.add(1);
  set1.add(2);
  set1.add(3);
  set1.add(4);

Set<Integer> set2 = new HashSet<>();
  set2.add(2);
  set2.add(3);
  set2.add(5);
  set2.add(6); 

Set<Integer> relevantBuckets = set1.stream()
            .filter(e -> Sets.intersection(set1, set2).size()>0)
            .collect(Collectors.toSet());

System.out.println(relevantBuckets);
Set<Integer> allElements = new HashSet<>();
   allElements.add(1);
   allElements.add(2);
   allElements.add(3);
   allElements.add(4);
   allElements.add(5);

Set<Integer> set1 = new HashSet<>();
    set1.add(1);
    set1.add(2);

Set<Integer> set2 = new HashSet<>();
    set2.add(1);
    set2.add(20);

    Bucket bucket1 = new Bucket();
    bucket1.setId(1);
    bucket1.setMySet(set1);

    Bucket bucket2 = new Bucket();
    bucket2.setId(2);
    bucket2.setMySet(set2);

    Set<Bucket> allBuckets = new HashSet<>();
    allBuckets.add(bucket1);
    allBuckets.add(bucket2);


    Set<Bucket> selectedBuckets = allBuckets.stream()
            .filter(e -> Sets.intersection(e.getMySet(), allElements).size()>0)
            .collect(Collectors.toSet());

    System.out.println(selectedBuckets);
    selectedBuckets = allBuckets.stream()
            .filter(e -> Sets.intersection(e.getMySet(), allElements).size()>1)
            .collect(Collectors.toSet());

    System.out.println(selectedBuckets);