Java8で追加されたAPI List編

【前提条件】

[環境]
[参考資料]

Java8 APIドキュメント
http://docs.oracle.com/javase/jp/8/api/

【概要】

今回はListクラスに追加されたメソッドです。

【replaceAllメソッド】

ListにもreplaceAllメソッドが追加されています。

[サンプルコード]
    public static void sampleReplaceAll() {

        final List<String> testList = new ArrayList<>();

        testList.add("one");
        testList.add("two");
        testList.add("three");

        testList.replaceAll(v -> "[" + v + "]");

        testList.forEach(System.out::println);
    }

List#replaceAllメソッドのパラメータは関数オブジェクトです。

関数オブジェクトのパラメータ、戻り値ともに
Listオブジェクト内の要素と同じ型です。

[実行結果]
[one]
[two]
[three]

全ての結果が置き換わっていることがわかります。

関数オブジェクト内部で
置き換え条件をつけてやれば特定の値だけの置き換えも可能です。

【sort】

Java8より前の場合、Listの並び替えを行う場合は
Collections#sortメソッドを使っていましたが、
List#sortでListオブジェクトに対して直接ソートさせることが出来ます。

[サンプルコード]
    public static void sampleSort() {

        final List<String> testList = new ArrayList<>();

        testList.add("one");
        testList.add("two");
        testList.add("three");
        testList.add("four");

        testList.sort((v1, v2) -> v2.length() - v1.length());

        testList.forEach(System.out::println);
    }

List#sorメソッドのパラメータはComparetorオブジェクトです。
ComparetorインターフェイスはJava8より
関数型インターフェイスとなっているのでラムダ式での指定が出来ます。

今までCollections#sortメソッドで
Comparetorインターフェイスを継承したクラスや
無名オブジェクトを作成していたのが
ラムダ式で簡潔にかけようになっています。

[実行結果]
three
four
one
two

【spliterator】

List#spliteratorメソッドはSpliteratorオブジェクトを返すメソッドです。

SpliteratorクラスはJava8から追加されたクラスで、
Iteratorのように順次処理を行ったり、
1つずつ要素に対して操作を行うためのクラスです。

[サンプルコード]
    public static void sampleSpliterator() {

        final List<String> testList = new ArrayList<>();

        testList.add("one");
        testList.add("two");
        testList.add("three");

        final Spliterator<String> spliter = testList.spliterator();
        spliter.tryAdvance(System.out::println);
        spliter.tryAdvance(System.out::println);

        testList.spliterator().forEachRemaining(System.out::println);
    }

List#spliteratorメソッドによって返却されたSpliteratorオブジェクトは
Spliterator#tryAdvanceメソッドで個別の処理、
Spliterator#forEachRemainingメソッドで順次処理を行います。

[実行結果]
one
two
one
two
three

【まとめ】

ListクラスはMapクラスに比べて追加されているメソッドが少ないようです。

StreamAPIを通して処理行うのが
基本的なスタンスなのかといった印象。

ただ、Listオブジェクトに対して
副作用を伴うソートと置き換えに関しては
Listクラスに追加されています。

List内の置き換えもソートを行う必要があった経験が
少なかったので、使用頻度はすくなさそうですが・・・