Что было бы хорошим способом сравнить два экземпляра Stream
в Java 8 и выяснить, имеют ли они одни и те же элементы, в частности, для модульного тестирования?Как сравнить два потока в Java 8
Что у меня сейчас:
@Test
void testSomething() {
Stream<Integer> expected;
Stream<Integer> thingUnderTest;
// (...)
Assert.assertArrayEquals(expected.toArray(), thingUnderTest.toArray());
}
или в качестве альтернативы:
Assert.assertEquals(
expected.collect(Collectors.toList()),
thingUnderTest.collect(Collectors.toList()));
Но это означает, что я строить две коллекции и отбрасывая их. Это не проблема производительности, учитывая размер моих тестовых потоков, но мне интересно, есть ли канонический способ сравнить два потока.
Я уверен, что нет никакого способа, не принуждая потоки в коллекцию или массив, как вы сделали выше. – joecoder
Задайте каждый запрос 'iterator()' и пройдите по ним в стоп-стоп. –
BTW, это появляется в рамках тестирования для самих Streams. Мы указали 18 режимов обхода (есть больше, это те, которые мы тестировали) и проходим по «одному» потоку всеми способами и сравниваем, что результаты идентичны (по модулю переупорядочений, разрешенных семантикой библиотеки потоков). См., Например , http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/test/java/util/stream/bootlib/java/util/stream/StreamTestScenario.java. –