web-dev-qa-db-fra.com

Comment paginer une liste d'objets en Java 8?

Donné un Java.util.List avec n éléments et une taille de page souhaitée m, je veux le transformer en une carte contenant n/m+n%m éléments. Chaque élément de carte doit contenir des éléments m.

Voici un exemple avec des entiers:

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

    // What is the equivalent Java 8 code to create the map below from my list?

    Map<Integer, List<Integer>> map = new HashMap<>();
    map.put(0, Arrays.asList(1,2,3));
    map.put(1, Arrays.asList(4,5,6));
    map.put(2, Arrays.asList(7,8,9));
    map.put(3, Arrays.asList(10));

Est-ce possible, en utilisant Java 8?

15
adragomir

Solution simple utilisant Guava: com.google.common.collect.Lists # partition :

    List<List<Integer>> partition = Lists.partition(list, 3); //<- here
    Map map = IntStream.range(0, partition.size()).boxed().collect(Collectors.toMap(
                    Function.identity(),
                    i -> partition.get(i)));
4

Comme indiqué dans les commentaires, cela fonctionne également si la liste n'est pas une séquence naturelle d'entiers. Vous devrez alors utiliser un IntStream généré et faire référence aux éléments de la liste par index.

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

Map<Integer, String> map = IntStream
    .range(0, list.size())
    .boxed()
    .collect(groupingBy(
        i -> i / 3, //no longer i-1 because we start with 0
        mapping(i -> list.get((int) i).toString(), joining(","))
        ));

//result: {0="1,2,3", 1="4,5,6", 2="7,8,9", 3="10"}

Nous commençons par un IntStream représentant les indices de la liste.

groupingBy regroupe les éléments par un classificateur. Dans votre cas, il regroupe x éléments par page.

mapping applique une fonction de mappage aux éléments et les recueille ensuite. Le mappage est nécessaire car joining n'accepte que CharSequence. joining lui-même joint les éléments à l'aide d'un délimiteur arbitraire.

0
a better oliver