コース一覧
    Java中級:Streamと関数型
    sorted で並び替え

    Java中級:Streamと関数型

    Stream APIと関数型インターフェースを学び、データ処理を宣言的で再利用しやすい形に書けるようにします。

    1
    Stream API
    01. Stream を作る5分
    02. filter で絞り込む5分
    03. map で変換する5分
    04. reduce で集約する5分
    05. collect で集める5分
    06. sorted で並び替え5分
    07. distinct で重複排除5分
    08. limit と skip5分
    09. 並列ストリーム5分
    10. Stream API まとめクイズ5分
    2
    関数型インターフェース
    01. ラムダ式の基本5分
    02. メソッド参照 ::5分
    03. Function インターフェース5分
    04. Predicate インターフェース5分
    05. Consumer と Supplier5分
    06. BiFunction と 2 引数の関数5分
    07. 関数型インターフェース まとめクイズ5分

    sorted で並び替え

    並べ替えたら、呼び出し元のリストまで並んでいた

    リストを並べ替えるとき、まず思いつくのは Collections.sort です。

    Java

    public static void printRanking(List<Integer> scores) {
        Collections.sort(scores);
        System.out.println(scores);
    }

    これは動きますが、scores そのものを並べ替えてしまいます。呼び出した側が「表示してもらっただけ」のつもりでいると、次の行で元の順番を使おうとしたときに、もう元の順番は残っていません。表示のためのメソッドが、渡されたデータを黙って書き換える形になっています。

    Stream の sorted() は、この問題が起きません。

    Java

    List<Integer> ranking = scores.stream().sorted().toList();
    System.out.println(scores); // 渡されたときのまま

    sorted() は並べ替えた新しい Stream を返すだけで、元のリストには指 1 本触れません。「並んだ結果が欲しい」と「元を並べ替えたい」は別の要求で、前者なら sorted() の方が安全です。

    引数なしなら自然順、渡せば好きな順

    sorted() を引数なしで呼ぶと、その型が元から持っている順番で並びます。数値なら小さい順、文字列なら辞書順です。これを自然順と呼びます。

    自然順で困るのは、自作クラスを並べたいときです。会員をどう並べるべきかは Java には分かりません。そこで、比べ方そのものを渡します。

    Java

    List<Member> byAge = members.stream()
        .sorted(Comparator.comparing(m -> m.age))
        .toList();

    Comparator.comparing には「何で比べるか」を取り出す式を渡します。ここでは年齢を取り出しているので、年齢の小さい順に並びます。大きい順にしたいときは、後ろに .reversed() を付けます。

    Java

    .sorted(Comparator.comparing(m -> m.age).reversed())

    同じ年齢の人の中では名前順にしたい、というときは .thenComparing(...) をつなぎます。比べ方を組み立ててから渡す、という形はどれも同じです。

    並べ方を渡さないと、実行時に落ちる

    自作クラスの Stream に、引数なしの sorted() を呼んだときが要注意です。

    Java

    members.stream().sorted().toList(); // ClassCastException

    これはコンパイルは通ります。sorted() は自然順があることを前提にしているだけで、コンパイラはその有無を確かめてくれないからです。比べ方を持っていないクラスを並べようとした瞬間、実行時に ClassCastException が出ます。

    解説

    数値や文字列を並べるときは引数なし、自作クラスを並べるときは Comparator を渡す、と覚えておけば、この例外にはまず出会いません。

    やってみよう

    Solution.sortedJoined(int[] arr) を完成させて、配列を昇順に並べた , 区切りの文字列を返してください。

    Arrays.stream(arr) で IntStream を作り、sorted() で並べ替えます。int の自然順は小さい順なので、引数は要りません。並べ終わったら文字列の Stream に変えて、前の回で使った Collectors.joining(",") でつなぎます。

    配列が空のときは空文字列を返します。同じ値が 2 回入っていても取り除く必要はありません。[3, 1, 1] なら 1,1,3 と、1 が 2 つ並んだまま出るのが正解です。

    要件

    1. クラス名は Solution、メソッド名は sortedJoined、引数は int[] arr ひとつにすること
    2. 戻り値の型は String で、Stream API の sorted() を使って昇順に並べ替え、, 区切りの 1 つの文字列にして返すこと
    3. 配列が空 (arr.length == 0) のときは空文字列 "" を返すこと

    ヒント

    `Arrays.stream(int[])` は `IntStream` を返します。`sorted()` は引数なしで昇順に並べ替えてくれます

    `IntStream` から直接 `Collectors.joining` は呼べないので、`mapToObj(String::valueOf)` で `Stream<String>` に変換してから `collect(Collectors.joining(","))` を呼びます

    空配列の場合は `Collectors.joining` も `""` を返しますが、意図を明示するために `if (arr.length == 0) return "";` のガードを先頭に書いておくと安全です

    生田 陸人
    監修生田 陸人
    ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
    編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

    関連レッスン

    • distinct で重複排除

      Stream の `distinct()` で配列やリストから重複要素を取り除き、ユニークな要素数を集計する書き方を身につけよう。

    • limit と skip

      Stream API の中間操作 limit と skip を使い、要素を先頭から数件だけ取り出したり、先頭の数件を飛ばしたりする方法を学んで、配列のスライス処理を Stream で書いてみよう。

    • 並列ストリーム

      Stream API の parallel() で配列を複数 CPU コアに分割集計させる並列ストリームの仕組みと、結合性・スレッド安全・順序保証など並列化の落とし穴を学びます。

    • Stream API まとめクイズ

      Stream API 章で学んだ生成 / filter / map / reduce / collect / sorted / distinct / limit / skip / parallel を、メソッドチェーンの順序と中間操作・ターミナル操作の使い分けで総ざらいする 4 択クイズ。

    このレッスンに出てくる用語

    意味があいまいなまま進んだ語は、ここから読み直せます。

    • リスト順序付きで複数の値を扱うデータ構造
    • メソッドクラスに属する関数
    • 引数位置引数=順番で渡す。
    • クラスデータと振る舞いを束ねる単位
    • コンパイルソースをバイトコードへ変換する処理
    • 配列サイズ固定の同型データの集まり
    • 戻り値呼び出し元への返答を表す点線矢印
    • エンドポイント「この URL を叩くとこの機能が動く」入口の住所
    main.java
    エディタを読み込んでいます

    メモ

    sorted で並び替え

    ⌘S で保存