首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8 streams -将方法传递给过滤器

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

Stack Overflow用户
提问于 2019-02-21 10:30:27
回答 2查看 137关注 0票数 1

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

代码语言:javascript
复制
public class Bucket {
    private Integer id;
    private Set<Integer> set1;
...
}

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

代码语言:javascript
复制
Set<Bucket> selectedBuckets = allBuckets.stream()
    .filter(e -> Sets.intersection(e.getSet1(), set2).size()>1)
    .collect(Collectors.toSet());

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

EN

回答 2

Stack Overflow用户

发布于 2019-02-21 10:47:41

假设您所指的是( Set set1内容的)与List中的任何其他Bucket的交集,那么您可能只是在寻找:

代码语言:javascript
复制
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());
票数 2
EN

Stack Overflow用户

发布于 2019-02-21 11:06:15

我发现了错误。实际上,我尝试使用整数而不是object Bucket进行重现,例如:

代码语言:javascript
复制
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

当我使用该对象进行复制时,它工作得很好。

代码语言:javascript
复制
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);

打印:[存储桶id=1,存储桶id=2]

代码语言:javascript
复制
    selectedBuckets = allBuckets.stream()
            .filter(e -> Sets.intersection(e.getMySet(), allElements).size()>1)
            .collect(Collectors.toSet());

    System.out.println(selectedBuckets);

打印:[Bucket id=1]

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54798311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档