Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
ストリーム.sorted() / distinct() / limit() / skip()
ストリームの中間操作として、要素の並べ替えに『sorted()』、重複除去に『distinct()』、件数を制限するために『limit()』、先頭をスキップする『skip()』を使用します(Java 8+)。これらはメソッドチェーンで組み合わせて使えます。
構文
// 自然順序(昇順)で並べ替えます。 ストリーム.sorted(); // コンパレーターを使って並べ替えます。 ストリーム.sorted(Comparator.reverseOrder()); // 重複する要素を除去します。 ストリーム.distinct(); // 先頭から指定件数だけ取得します。 ストリーム.limit(件数); // 先頭から指定件数をスキップします。 ストリーム.skip(件数); // 各要素を確認しながら通過させます(デバッグ用)。 ストリーム.peek(要素 -> 処理);
メソッド一覧
| メソッド | 概要 |
|---|---|
| sorted() | 要素を自然順序(昇順)で並べ替える中間操作です。要素は Comparable を実装している必要があります。 |
| sorted(Comparator) | 指定したコンパレーターで並べ替える中間操作です。 |
| distinct() | 重複する要素を除去する中間操作です。equals() と hashCode() を使って判定します。 |
| limit(long maxSize) | 先頭から指定した件数の要素だけを残す中間操作です。 |
| skip(long n) | 先頭から指定した件数の要素をスキップする中間操作です。 |
| peek(Consumer) | 要素を通過させながら処理を実行する中間操作です。主にデバッグ用途で使用します。 |
サンプルコード
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
List<Integer> numbers = Arrays.asList(5, 3, 1, 4, 2, 3, 5, 1);
// 昇順で並べ替えます。
numbers.stream()
.sorted()
.forEach(System.out::println); // 『1』『1』『2』『3』『3』『4』『5』『5』と出力されます。
// 降順で並べ替えます。
numbers.stream()
.sorted(Comparator.reverseOrder())
.forEach(System.out::println); // 降順で出力されます。
// 重複を除去します。
numbers.stream()
.distinct()
.forEach(System.out::println); // 『5』『3』『1』『4』『2』と出力されます(重複除去後)。
// 先頭から3件だけ取得します。
numbers.stream()
.sorted()
.limit(3)
.forEach(System.out::println); // 『1』『1』『2』と出力されます。
// 先頭の3件をスキップします。
numbers.stream()
.sorted()
.skip(3)
.forEach(System.out::println); // 4件目以降が出力されます。
// 文字列を長さで並べ替えます。
List<String> words = Arrays.asList("banana", "apple", "kiwi", "cherry");
words.stream()
.sorted(Comparator.comparingInt(String::length))
.forEach(System.out::println); // 『kiwi』『apple』『banana』『cherry』と出力されます。
概要
『sorted()』は中間操作のため元のコレクションを変更しません。並べ替えには要素が Comparable を実装している必要があります(String・Integer などは実装済みです)。独自クラスを並べ替えるには Comparator を指定してください。
『limit()』と『skip()』を組み合わせるとページネーション処理が実装できます(例: skip(20).limit(10) で21〜30件目を取得)。『sorted()』は全要素をソートするため、大量データに対して使用する場合はパフォーマンスに注意してください。
ストリームの生成・絞り込みについては『stream() / filter() / map()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。