Java 8流-将方法传递给过滤器

时间:2019-02-21 02:30:27

标签: java java-8 java-stream

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

public class Bucket {
    private Integer id;
    private Set<Integer> set1;
...
}

我想使用流过滤存储桶,但仅使用set1与另一个set2相交的存储桶。我尝试了以下代码:

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

但是这将返回allBuckets的所有元素,而不是仅返回包含交集的元素。我怎样才能做到这一点 ?

2 个答案:

答案 0 :(得分:2)

假设您的意思是与Set 中的其他Bucket相交(List set1内容)的:

List<Bucket> allBuckets = new ArrayList<>(); // as you may initialise
Set<Bucket> selectedBuckets = allBuckets.stream()
        .filter(e -> allBuckets.stream()
                .filter(f -> f != e)
                .flatMap(b -> b.getSet1().stream())
                .anyMatch(s -> e.getSet1().contains(s)))
        .collect(Collectors.toSet());

答案 1 :(得分:0)

我发现了错误。实际上,我尝试使用Integers而不是对象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);

打印:[1、2、3、4]

当我使用该对象复制时,它工作正常。

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);

打印:[Bucket [id = 1],Bucket [id = 2]]

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

    System.out.println(selectedBuckets);

打印:[Bucket [id = 1]]

我考虑过删除问题,但是由于社区可以从中受益,因此我决定在问题本身中回答,而不是进行编辑。