かまたま日記3

プログラミングメイン、たまに日常

JavaでRubyのeach_sliceがしたい

each_sliceというのは配列を指定した要素数の配列に分ける処理です。リストの中身をn件ごとに処理するときに便利です。 Javaには同様の処理が(たぶん)標準APIには無いので、こんな感じで行けそうです。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Test
{
    public static void main(String[] args)
    {
        // [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]
        System.out.println(slice(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 3));
    }

    private static <T> List<List<T>> slice(List<T> list, int n)
    {
        final int resultSize = (int) Math.ceil((double) list.size() / n);
        return IntStream.range(0, resultSize)
                .mapToObj(i -> list.subList(n * i, Math.min(list.size(), n * (i + 1))))
                .collect(Collectors.toList());
    }
}

参考: Is there a way to do the Ruby each_slice in Java 8? - Stack Overflow