n
要素を含むJava.util.List
と必要なページサイズm
を指定して、n/m+n%m
要素を含むマップに変換します。各マップ要素には、m
要素が含まれます。
以下は整数の例です:
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));
Java 8を使用して、これは可能ですか?
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)));
コメントで述べたように、これはリストが整数の自然なシーケンスではない場合にも機能します。次に、生成されたIntStream
を使用して、リスト内の要素をインデックスで参照する必要があります。
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"}
まず、リストのインデックスを表すIntStream
から始めます。
groupingBy
は、分類子によって要素をグループ化します。あなたの場合、ページごとにx要素をグループ化します。
mapping
は、マッピング関数を要素に適用し、後でそれらを収集します。 joining
はCharSequence
のみを受け入れるため、マッピングが必要です。 joining
自体は、任意の区切り文字を使用して要素を結合します。