1. [1, 2, 3] の合計は 6
  2. 空配列 [] の合計は 0
  3. [10, 20, 30, 40] の合計は 100
  4. 負の数を含む [-5, 5, -10, 10] の合計は 0
  5. 1 要素のみ [7] の合計は 7
コース一覧
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分

ラムダ式の基本

中身は 1 行なのに、まわりに 5 行付いてくる

金額を表示用の文字列に整える処理を、後から差し替えられるようにしたいとします。Java でこれをやるには、まず入り口になるインタフェースを 1 つ用意します。

Java

interface Formatter { String format(int amount); }

そして中身を渡します。Java 7 まではこう書くしかありませんでした。

Java

Formatter yen = new Formatter() { @Override public String format(int amount) { return amount + " 円"; } };

名前を付けないクラスをその場で作って渡す書き方で、匿名クラスと呼びます。書きたいのは amount + " 円" の 1 行だけなのに、new Formatter()、@Override、メソッドの宣言、閉じ括弧と、まわりに 5 行付いてきます。中身より外側の方が長い状態です。

メソッドが 1 つなら、名前は書かなくても決まる

よく見ると、この 5 行はどれも「書かなくても分かる」ものです。Formatter にはメソッドが 1 つしかないので、渡した中身がどのメソッドの実装なのかは、書かなくても決まります。型も、変数の宣言側に Formatter と書いてあります。

Java 8 からは、その決まりきった部分を全部省けるようになりました。

Java

Formatter yen = amount -> amount + " 円";

-> の左が引数、右が返す値です。これがラムダ式です。amount の型も書いていませんが、Formatter の format が int を受け取ると分かっているので、コンパイラが埋めてくれます。呼び方は匿名クラスのときと変わりません。

Java

System.out.println(yen.format(1200)); // 1200 円

1 行で収まらないときは、{ } で囲んで return を書きます。

Java

Formatter taxIncluded = amount -> { int total = amount * 11 / 10; return total + " 円 (税込)"; };

書けるのは、メソッドが 1 つだけのインタフェース

ラムダ式は、どんなインタフェースにも使えるわけではありません。メソッドが 1 つしかないインタフェースだけです。2 つあると、書いた中身がどちらの実装なのか決められないからです。

自分で作るインタフェースには @FunctionalInterface を付けておくと安心です。うっかり 2 つ目のメソッドを足したときに、コンパイラが「これはもうラムダ式で書けない」と教えてくれます。

解説

Stream のメソッドが軒並みラムダ式を受け取れるのは、引数の型がすべてこの「メソッドが 1 つだけ」のインタフェースだからです。filter に渡していた n -> n > 0 も、sorted に渡していた比べ方も、正体はその場で作った実装でした。

やってみよう

Solution.lambdaSum(int[] arr) を static メソッドとして完成させて、配列の合計を返してください。

Arrays.stream(arr) で作った IntStream を boxed() で Stream<Integer> に変え、mapToInt にラムダ式を渡してから sum() で合計を取ります。遠回りに見えますが、Stream<Integer> から数値の Stream に戻すところでラムダ式を 1 つ書く、という流れをここで通しておくためです。

mapToInt に渡す式は、受け取った値をそのまま返すだけで足ります。空配列のときは合計が 0 になるので、長さを調べる if は要りません。

要件

  1. Solution.lambdaSum(int[] arr) の static メソッドとして実装すること
  2. Arrays.stream(arr) で int[] を IntStream に変換し、.boxed() で Stream<Integer> に変えてから mapToInt(n -> n) でラムダ式を適用すること
  3. 最終的に sum() を呼んで合計を int で返すこと (空配列なら自動的に 0 が返る)

入出力例

lambdaSum([1,2,3]) → 6 lambdaSum([]) → 0 lambdaSum([10,20,30,40]) → 100 lambdaSum([-5,5,-10,10]) → 0 lambdaSum([7]) → 7

ヒント

ファイル先頭で `import java.util.Arrays;` を書くのを忘れないでください

`IntStream` には `mapToInt` がないので、先に `.boxed()` で `Stream<Integer>` に変換してから `mapToInt(n -> n)` を呼びます

ラムダ式 `n -> n` は「受け取った値をそのまま返す」恒等関数で、`Stream<Integer>` の `mapToInt` にそのまま渡せます

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

関連レッスン

  • メソッド参照 ::

    ラムダ式をさらに短く書ける「メソッド参照 `Class::method`」の 4 種類と使い分けを学び、Stream + `String::toUpperCase` で文字列を大文字化して連結するコードを書いてみよう。

  • 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 での活用までを身につけよう。

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

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

  • 処理計算や代入を表す長方形
  • クラスデータと振る舞いを束ねる単位
  • メソッドクラスに属する関数
  • 変数データに名前をつけて参照する仕組み
  • 引数位置引数=順番で渡す。
  • 配列サイズ固定の同型データの集まり
main.java
学習モード
エディタを読み込んでいます

メモ

ラムダ式の基本

⌘S で保存