web-dev-qa-db-ja.com

Java 8でオブジェクトのリストにページ番号を付ける方法は?

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を使用して、これは可能ですか?

15
adragomir

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は、マッピング関数を要素に適用し、後でそれらを収集します。 joiningCharSequenceのみを受け入れるため、マッピングが必要です。 joining自体は、任意の区切り文字を使用して要素を結合します。

0
a better oliver