Listをsplit

書いてみた。

public final class ListUtils {

    private ListUtils() {}

    public static <E> List<List<E>> split(List<E> list, E delim, SplitMode mode) {
        if (list == null || mode == null) {
            throw new NullPointerException();
        }
        List<List<E>> result = new ArrayList<List<E>>();
        List<E> crnt = new ArrayList<E>();
        for (E e : list) {
            if ((delim == null && e == null) || (delim != null && delim.equals(e))) {
                if (mode.isAddElem(crnt)) {
                    result.add(crnt);
                    crnt = new ArrayList<E>();
                }
            } else {
                crnt.add(e);
            }
        }
        if (crnt.size() != 0 && !crnt.get(0).equals(delim))
            result.add(crnt);
        return result;
    }

    public static <E> List<List<E>> split(List<E> list, E delim) {
        return split(list, delim, SplitMode.NOT_ACCEPT_EMPTY_ELEM);
    }

    public static enum SplitMode {
        ACCEPT_EMPTY_ELEM {
            boolean isAddElem(List<?> elem) {
                return true;
            }
        },
        NOT_ACCEPT_EMPTY_ELEM {
            boolean isAddElem(List<?> elem) {
                return elem.size() != 0;
            }
        };
        abstract boolean isAddElem(List<?> elem);
    }
}

使い方は

List<String> list = Arrays.asList("hoge", "", "piyo", "foo", "", "bar");
List<List<String>> splitList = ListUtils.split(list, "");
for (List<String> l : splitList) {
    // [hoge]
    // [piyo, foo]
    // [bar]
    System.out.println(l);
}

こんな感じ。ファイルからListとして読み込んで空行で区切るようなイメージ。
モードは2つしか思いつかなかったからbooleanでいいな。