测试两个集合是否与Java流共享3个元素

测试两个集合是否与Java流共享3个元素,java,set,java-stream,Java,Set,Java Stream,我需要一个Java流操作来测试两个集合是否至少有3个公共元素 以下是我的Java 7代码,运行良好: @Test public void testContainement(){ Set<Integer> setOne = IntStream.of(0,1,4,3) .boxed() .collect(Collectors.toCollec

我需要一个Java流操作来测试两个集合是否至少有3个公共元素

以下是我的Java 7代码,运行良好:

@Test
public void testContainement(){
    Set<Integer> setOne = IntStream.of(0,1,4,3)
                                   .boxed()
                                   .collect(Collectors.toCollection(HashSet::new));

    Set<Integer> setTwo = IntStream.of(0,1,4,5)
            .boxed()
            .collect(Collectors.toCollection(HashSet::new));

    Assertions.assertEquals(true,testSets(setOne,setTwo));

}

private boolean testSets( Set<Integer> setOne, Set<Integer> setTwo ) {
    int counter=0;
    for (int x: setOne){
        if (setTwo.contains(x))
            counter++;
    }
    return counter > 2;
}
@测试
公共void testcontainment(){
Set setOne=IntStream.of(0,1,4,3)
.boxed()
.collect(Collectors.toCollection(HashSet::new));
Set setTwo=IntStream.of(0,1,4,5)
.boxed()
.collect(Collectors.toCollection(HashSet::new));
assertEquals(true,testset(setOne,setTwo));
}
专用布尔测试集(集合setOne、集合SETTOW){
int计数器=0;
for(int x:setOne){
if(setTwo.contains(x))
计数器++;
}
返回计数器>2;
}

如何使用Java流操作实现这一点?

使用
stream.count
as

private boolean testSets(Set<Integer> setOne, Set<Integer> setTwo) {
    return setOne.stream().filter(setTwo::contains).count() > 2;
}

您可以简单地使用Set.retainAll(Collection):

setOne.retainAll(setTwo);
boolean isMoreTwo = setOne.size() > 2
如果不想修改
setOne
,请创建该集合的新实例:

Set<Integer> newSetOne = new HashSet<>(setOne)
newSetOne.retainAll(setTwo);
boolean isMoreTwo = newSetOne.size() > 2
此外,它还应该写得像:

Assertions.assertTrue(testSets(setOne,setTwo));
为了达到您的要求,您应该计算集合之间匹配元素的数量,并在达到所需目标后立即停止

long nbMatchLimitedToThree = setOne.stream().filter(setTwo::contains).limit(3).count();
Assertions.assertEqual(3, nbMatchLimitedToThree, "At least 3 matches expected but actually only " +  nbMatchLimitedToThree +". setOne=" + setOne + ",setTwo=" + setTwo);  

这是一种性能更高的编写单元测试的正确方法。

guava使其非常易于阅读:

private boolean testSets( Set<Integer> setOne, Set<Integer> setTwo ) {
     return Sets.intersection(setOne, setTwo).size() > 2;
}
private boolean测试集(Set setOne,Set setTwo){
return Sets.intersection(setOne,setTwo).size()>2;
}

您可能希望将
限制(3)
放在
过滤器
之后,以防止流在不必要时越过
setOne
的所有元素。@Slaw-yup使用限制短路是有意义的。谢谢。顺便说一下,这不是您的java-7代码,用于
@Test
方法,实际上:)考虑到内存和时间消耗,这个解决方案是最好的。因为我将有数千个调用这个方法。考虑到我的要求,你是否同意另一个awnser是最好的。谢谢你的帮助,我发布了最新消息。第二部分应该为您提供在性能和单元测试方面编写本部分的正确方法。
long nbMatchLimitedToThree = setOne.stream().filter(setTwo::contains).limit(3).count();
Assertions.assertEqual(3, nbMatchLimitedToThree, "At least 3 matches expected but actually only " +  nbMatchLimitedToThree +". setOne=" + setOne + ",setTwo=" + setTwo);  
private boolean testSets( Set<Integer> setOne, Set<Integer> setTwo ) {
     return Sets.intersection(setOne, setTwo).size() > 2;
}