Comment comparer deux flux dans Java 8

Quel serait un bon moyen de comparer deux instances Stream dans Java 8 et de savoir si elles ont les mêmes éléments, spécifiquement à des fins de test unitaire?

Ce que j'ai maintenant, c'est:

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

, Ou alternativement:

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

Mais cela signifie que je construis deux collections et les rejette. Ce n'est pas un problème de performance, compte tenu de la taille de mes flux de test, mais je me demande s'il existe un moyen canonique de comparer deux flux.

24
demandé sur Vlad 2016-01-15 22:36:24

3 réponses

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();
}
23
répondu ZhongYu 2016-01-15 19:52:27

La collecte du flux en cours de test (comme vous le montrez) est un moyen simple et efficace d'effectuer le test. Vous pouvez créer la liste des résultats attendus de la manière la plus simple disponible, ce qui peut ne pas être la collecte d'un flux.

Alternativement, avec la plupart des bibliothèques pour créer des collaborateurs fictifs, on pourrait simuler un Consumer qui "attend" une série d'appels accept() avec des éléments particuliers. consommez le Stream avec lui, puis "vérifiez" que ses attentes configurées étaient rencontrer.

4
répondu erickson 2016-01-15 19:59:49
public static boolean equalStreams(Stream<?>...streams) {
    List<Iterator<?>>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);
}
1
répondu Marc Dzaebel 2017-10-13 11:06:14