Java8で追加されたAPI List編
【概要】
今回は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内の置き換えもソートを行う必要があった経験が
少なかったので、使用頻度はすくなさそうですが・・・