1. 2 要素を大文字化してカンマ連結
  2. 引数なし (空配列) のときは空文字を返す
  3. 1 要素はそのまま大文字化
  4. すでに大文字混じりでも全て大文字に揃える
  5. 空文字を含む要素もそのまま連結される
コース一覧
Java 中級:コレクション・Stream・例外処理
メソッド参照 ::

Java 中級:コレクション・Stream・例外処理

コレクション、ジェネリクス、例外処理、Stream API、関数型インターフェース、日付処理、ファイル I/O、継承など Java の中級トピックを実践的に学べるコースです。Java の基礎文法とオブジェクト指向を理解している学習者を対象に、現場の Java コードを読み書きするための知識を補強します。約 16 時間 (1 日 30 分 × 32 日) で 64 レッスンを修了でき、修了後は Spring Boot や業務システム開発に必要な Java 力が身につきます。

1
コレクション基礎
01. ArrayList を使う5分
02. List を走査する5分
03. 要素の削除と検索5分
04. HashMap の基本5分
05. Map を走査する5分
06. Set で重複を排除5分
07. Collections クラスの便利メソッド5分
08. コレクション基礎 まとめクイズ5分
2
ジェネリクス
01. ジェネリッククラスを作る5分
02. ジェネリックメソッド5分
03. 境界型パラメータ5分
04. ワイルドカード ?5分
05. Pair<K,V> を作る5分
06. ジェネリクス まとめクイズ5分
3
例外処理
01. try-catch で例外をつかむ5分
02. 複数の catch ブロック5分
03. throws と例外の伝播5分
04. 独自の例外を作る5分
05. try-with-resources5分
06. finally ブロック5分
07. 例外処理 まとめクイズ5分
4
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分
5
関数型インターフェース
01. ラムダ式の基本5分
02. メソッド参照 ::5分
03. Function インターフェース5分
04. Predicate インターフェース5分
05. Consumer と Supplier5分
06. BiFunction と 2 引数の関数5分
07. 関数型インターフェース まとめクイズ5分
6
文字列操作
01. String.format で書式化5分
02. StringBuilder で連結5分
03. 正規表現の基本5分
04. split と join5分
05. 文字列操作 まとめクイズ5分
7
日付と時刻
01. LocalDate で日付を扱う5分
02. LocalDateTime で時刻も扱う5分
03. Duration で時間差を計算5分
04. 日付の書式化とパース5分
05. 日付の加減算5分
06. 日付と時刻 まとめクイズ5分
8
ファイル I/O
01. Files でファイルに書き込む5分
02. ファイルを行単位で読む5分
03. Path でファイルパスを扱う5分
04. BufferedReader と Stream API5分
05. ファイルの存在確認と削除5分
06. ファイル I/O まとめクイズ5分
9
継承とポリモーフィズム
01. extends で継承する5分
02. super で親を呼ぶ5分
03. メソッドのオーバーライド5分
04. abstract で抽象クラス5分
05. interface で契約を定義5分
06. default メソッド5分
07. instanceof と型パターン5分
08. ポリモーフィズムを活かす5分
09. 継承とポリモーフィズム まとめクイズ5分

メソッド参照 ::

同じ名前を 2 回書いている

ラムダ式で短く書けるようになったはずなのに、まだ気になる形が残ります。

Java

lines.forEach(line -> System.out.println(line));

このラムダ式がやっているのは、受け取った line を、そのまま println に渡すことだけです。line という名前は、受け取るために 1 回、渡すためにもう 1 回、合計 2 回書いています。中身を加工しているならともかく、素通しさせるためだけに名前を用意しているわけです。

この形は、名前ごと省けます。

Java

lines.forEach(System.out::println);

:: の左に呼ぶ相手、右にメソッド名を書きます。引数は書きません。「流れてきたものを、このメソッドにそのまま渡す」という意味が、これだけで伝わります。これがメソッド参照です。

呼ぶ相手の書き方は 3 通り

:: の左に何を書くかは、どのメソッドを呼びたいかで決まります。

すでにあるオブジェクトのメソッドを呼ぶなら、そのオブジェクトを書きます。System.out::println がこの形で、System.out という決まった 1 つの出力先に対して println を呼びます。

static メソッドなら、クラス名を書きます。

Java

List<Integer> nums = texts.stream() .map(s -> Integer.parseInt(s)) // ラムダ式 .toList(); List<Integer> nums = texts.stream() .map(Integer::parseInt) // メソッド参照 .toList();

3 つ目が少し変わっていて、流れてくる要素自身のメソッドを呼びたいときも、クラス名を書きます。

Java

List<String> cleaned = lines.stream() .map(String::trim) .toList();

String::trim は「String クラスの trim を、流れてきたその String に対して呼ぶ」という意味です。static メソッド参照と見た目が同じなので混乱しやすいところですが、trim() は引数を取らないメソッドなので、Integer.parseInt(s) のように引数として渡すことはできません。どちらの意味になるかは、そのメソッドが static かどうかで自動的に決まります。

手を加えているなら、:: にはできない

メソッド参照にできるのは、受け取ったものを丸ごとそのメソッドに渡すときだけです。ほんの少しでも加工していたら使えません。

Java

.map(s -> s.trim() + "!") // 結果に足しているので不可 .filter(s -> s.length() > 3) // 呼んだ結果を比べているので不可

どちらも「呼ぶだけ」を超えています。無理に短くしようとせず、ラムダ式のままにします。

解説

短く書けるかどうかで迷ったら、そのラムダ式を声に出して読んでみてください。「受け取って、そのまま渡す」で言い切れるなら :: にできます。「受け取って、渡して、それから」と続くならできません。

やってみよう

Solution.toUpperJoined(String... arr) を完成させて、受け取った文字列を全部大文字にしてから , でつないだ結果を返してください。

Arrays.stream(arr) で Stream<String> を作り、map で大文字に変えて、Collectors.joining(",") でつなぎます。大文字にするメソッドは引数を取らないので、ラムダ式で書くと引数名がちょうど 2 回出てきます。そこが :: に置き換えられる形です。

引数が 1 つも無いときは空文字列が返ります。空文字列が要素として混ざっている ["a", "", "b"] のときは、大文字にしても空文字列のままなので、A,,B のように区切りが 2 つ続きます。

要件

  1. Arrays.stream(arr) で配列から Stream<String> を作ること
  2. map に String::toUpperCase の メソッド参照 を渡して大文字化すること (ラムダ s -> s.toUpperCase() でも可だが、メソッド参照が望ましい)
  3. Collectors.joining(",") を使って , 区切りで連結した結果を返すこと

入出力例

toUpperJoined("abc", "def") → "ABC,DEF" toUpperJoined() → "" toUpperJoined("hello") → "HELLO" toUpperJoined("Java", "Stream", "Lambda") → "JAVA,STREAM,LAMBDA" toUpperJoined("a", "", "b") → "A,,B"

ヒント

`import java.util.Arrays;` と `import java.util.stream.Collectors;` の 2 行を最初に書きます

`Arrays.stream(arr).map(String::toUpperCase).collect(Collectors.joining(","))` という 3 段のパイプラインで完成します

`joining(",")` は空ストリームに対して空文字 `""` を返すので、空配列の特殊処理は不要です

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

関連レッスン

  • Function インターフェース

    Java の代表的な関数型インタフェース `Function<T, R>` を取り上げ、ラムダ式で値を変換する関数を作って `apply` で呼び出すコードを書いてみよう。

  • Predicate インターフェース

    Java の関数型インターフェースの代表格 `Predicate<T>` を取り上げ、`test` メソッドで条件を判定し、`and` `or` `negate` で条件を合成する書き方を身につけよう。

  • Consumer と Supplier

    java.util.function パッケージの代表的な関数型インターフェース Consumer と Supplier の役割と使い分けを学び、List.forEach や Stream.peek での活用までを身につけよう。

  • BiFunction と 2 引数の関数

    2 つの引数を受け取って 1 つの値を返す BiFunction、同じ型同士を扱う BinaryOperator、そして BiPredicate / BiConsumer といった「2 引数版」の関数型インターフェースを整理し、引数が複数あるラムダの書き方を身につけよう。

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

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

  • メソッドクラスに属する関数
  • 引数位置引数=順番で渡す。
  • オブジェクトキーと値のペアで構造を作るデータ
  • クラスデータと振る舞いを束ねる単位
  • 配列サイズ固定の同型データの集まり
main.java
学習モード
エディタを読み込んでいます

メモ

メソッド参照 ::

⌘S で保存