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?
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)));
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.