如何在Java 8中比较两个Streams

Vla*_*lad 28 java junit java-8

比较StreamJava 8中的两个实例并找出它们是否具有相同的元素,特别是出于单元测试的目的,有什么好方法?

我现在得到的是:

@Test
void testSomething() {
  Stream<Integer> expected;
  Stream<Integer> thingUnderTest;
  // (...)
  Assert.assertArrayEquals(expected.toArray(), thingUnderTest.toArray());
}
Run Code Online (Sandbox Code Playgroud)

或者:

Assert.assertEquals(
    expected.collect(Collectors.toList()),
    thingUnderTest.collect(Collectors.toList()));
Run Code Online (Sandbox Code Playgroud)

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

Zho*_*gYu 25

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();
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为你可以使用`BaseStream&lt;?,?&gt; s1, BaseStream&lt;?,?&gt; s2` 来支持`IntStream`、`LongStream` 和`DoubleStream`。 (3认同)