Skip to main content

Stream devoxx 2014

Le but du jeu est d'écrire une fonction permettant de concaténer un certain nombre de listes, passées en paramètre sous forme de var-arg :

public <T> List<T> concatLists(List<T>... lists);

 

Version 1 : foreach

Algorithme

Boucler sur chaque liste et les rajouter dans une liste.

Solution

 

public <T> List<T> concatLists1(List<T>... lists) {
    ArrayList<T> result = new ArrayList<>();
    for (List<T> list : lists) {
        result.addAll(list);
    }
    return result;
}

 

Version 2 : Reduce

Algorithme

L'opérateur Reduce est

T reduce(T identity,
         BinaryOperator<T> accumulator)

Effectue une réduction sur les éléments de ce flux, à l'aide de la valeur d'identité fournie et d'une fonction d'accumulation associative, et renvoie la valeur réduite. Cela équivaut à :

   T result = identity;
     for (T element : this stream)
         result = accumulator.apply(result, element)
     return result;
 

L'idée est de concater les listes avec un stream

Solution

public <T> List<T> concatLists2(List<T>... lists) {
    return Stream.of(lists).reduce(new ArrayList<>(), (list1, list2) -> {
        list1.addAll(list2);
        return list1;
    });
}

Version 3 via flatMap

Algorithme

<R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper)

La méthode flatMap() permet d'appliquer une fonction à chaque élément du flux puis d'aplatir le résultat en un nouveau flux.

 

Solution

public static <T> List<T> concatLists(List<T>... lists) {
       return Stream.of(lists).flatMap(List::stream).collect(Collectors.toList());
   }