我有一组整数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的所有元素,而不是仅返回其集合包含交集的元素。我该怎么做呢?
发布于 2019-02-21 10:47:41
假设您所指的是( Set set1内容的)与List中的任何其他Bucket的交集,那么您可能只是在寻找:
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());发布于 2019-02-21 11:06:15
我发现了错误。实际上,我尝试使用整数而不是object 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);打印:[存储桶id=1,存储桶id=2]
selectedBuckets = allBuckets.stream()
.filter(e -> Sets.intersection(e.getMySet(), allElements).size()>1)
.collect(Collectors.toSet());
System.out.println(selectedBuckets);打印:[Bucket id=1]
我考虑过删除这个问题,但由于社区可以从中受益,我决定在问题本身中回答,而不是编辑。
https://stackoverflow.com/questions/54798311
复制相似问题