如何在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); }