Java8流-将方法传递给筛选器
我有一组整数set2和一个对象: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 ->
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);