如何在Java 8中比较两个Streams

比较Java 8中的两个Stream实例并找出它们是否具有相同的元素,特别是用于unit testing的目的是什么?

我现在得到的是:

 @Test void testSomething() { Stream expected; Stream thingUnderTest; // (...) Assert.assertArrayEquals(expected.toArray(), thingUnderTest.toArray()); } 

或者:

 Assert.assertEquals( expected.collect(Collectors.toList()), thingUnderTest.collect(Collectors.toList())); 

但这意味着我正在构建两个集合并丢弃它们。 考虑到测试流的大小,这不是性能问题,但我想知道是否有一种规范的方法来比较两个流。

 static void assertStreamEquals(Stream s1, Stream s2) { Iterator iter1 = s1.iterator(), iter2 = s2.iterator(); while(iter1.hasNext() && iter2.hasNext()) assertEquals(iter1.next(), iter2.next()); assert !iter1.hasNext() && !iter2.hasNext(); } 

收集测试中的流(如您所示)是执行测试的简单而有效的方法。 您可以以最简单的方式创建预期结果列表,这可能不会收集流。

或者,对于大多数用于创建模拟协作者的库,可以模拟Consumer “期望”一系列具有特定元素的accept()调用。 使用它消耗 Stream ,然后“validation”其配置的期望得到满足。

 public static boolean equalStreams(Stream...streams) { List>is = Arrays.stream(streams).map(Stream::iterator).collect(Collectors.toList()); while(is.stream().allMatch(Iterator::hasNext)) if(is.stream().map(Iterator::next).distinct().limit(2).count()>1) return false; return is.stream().noneMatch(Iterator::hasNext); }