1. [1, 2, 3] の各要素を 2 乗して合計すると 14 になる
  2. 空配列 [] は合計 0 を返す
  3. 要素 1 個 [5] は 5*5 = 25 を返す
  4. [2, 4] は 4 + 16 = 20 を返す
  5. [0, 0, 0] は 0 を返す
コース一覧
Java 中級:コレクション・Stream・例外処理
map で変換する

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分

map で変換する

入れ物を先に用意するのが面倒

名前のリストから、それぞれの文字数のリストを作りたいとします。for で書くと、まず空のリストを用意するところから始まります。

Java

List<Integer> lengths = new ArrayList<>(); for (String name : names) { lengths.add(name.length()); }

やりたいのは「文字数に変える」だけなのに、入れ物を作る行と、そこに詰める行が必要です。しかも lengths は宣言してから中身が入るまで空っぽの状態が続くので、途中で return を書き足すと未完成のリストが漏れます。

map を使うと、変換の中身だけを書けば済みます。

Java

List<Integer> lengths = names.stream() .map(name -> name.length()) .toList();

map は個数を変えず、型だけ変える

map に渡すのは「1 つ受け取って、1 つ返す」式です。要素ごとに 1 対 1 で入れ替えるので、3 件流せば必ず 3 件出てきます。件数を減らしたいときは filter の出番で、map は形の担当です。

そのかわり、map は Stream の型を変えます。names は Stream<String> ですが、name.length() が返すのは数値なので、map を通した後は Stream<Integer> になります。元の型と違う型を返してよい、というのが map のいちばんの働きどころです。

map は filter と同じ中間操作なので、書いただけでは何も起きません。toList() のような終端操作を呼んだときに、はじめて全要素が変換されます。

数値の Stream には数値を返す

IntStream にも map があります。摂氏の配列を華氏に直すなら、こう書けます。

Java

int[] fahrenheit = IntStream.of(celsius) .map(c -> c * 9 / 5 + 32) .toArray();

ここで 1 つ、はまりやすい制限があります。IntStream の map は int を受け取って int を返す式しか受け付けません。

Java

IntStream.of(celsius).map(c -> c + " 度"); // コンパイルエラー

数値の Stream から文字列や自作クラスに変えたいときは、map ではなく mapToObj を使います。逆に Stream<String> から数値の Stream に落としたいときは mapToInt です。名前が違うだけで、やっていることはどれも「1 つ受け取って 1 つ返す」で同じです。

解説

数値を数値のまま扱う IntStream には、合計や平均を出す終端操作がそろっています。Stream<Integer> にはこれらが無いので、数を集計するときは IntStream に寄せるのが定番です。

やってみよう

Solution.squareSum(int[] arr) を完成させて、各要素を 2 乗した合計を返してください。

Arrays.stream(arr) で IntStream を作り、map に 2 乗する式を渡してから、合計を出す終端操作 sum() を呼びます。for を回して自分で足し込むのは禁止です。map で形を変えてから集計する、という流れをここで通しておいてください。

戻り値は int で、sum() が返すのも int なので、今回はキャストは要りません。空配列を渡したときは、流れる要素が 1 つも無いので sum() の結果が 0 になります。長さを調べる if は不要です。

要件

  1. Arrays.stream(arr) で int[] を IntStream に変換すること
  2. map(x -> x * x) を使って各要素を 2 乗する Stream の中間操作を使うこと (生の for ループで合計するのは NG)
  3. 終端操作 sum() を呼んで int の合計を return すること

入出力例

squareSum([1,2,3]) → 14 squareSum([]) → 0 squareSum([5]) → 25 squareSum([2,4]) → 20 squareSum([0,0,0]) → 0

ヒント

`Arrays.stream(int[])` の戻り値は `IntStream` です。`Stream<Integer>` ではないので、`mapToInt` を挟まずに `map(x -> x * x)` がそのまま使えます

`IntStream.map` のラムダは `int -> int` の関数です。`x -> x * x` のように `int` を返す式を書きましょう

空配列のときは `IntStream` が空になり、`sum()` は自動で `0` を返します。特別な分岐を書く必要はありません

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

関連レッスン

  • reduce で集約する

    Stream API の `reduce` を使って配列の要素を 1 つの値に畳み込む方法を学び、整数配列の積を求めるコードを書いてみよう。

  • collect で集める

    Stream の終端操作 collect と Collectors の代表的なファクトリ (toList, toSet, toMap, joining) を学び、filter で絞り込んだ要素を joining で文字列にまとめてみよう。

  • sorted で並び替え

    Stream の sorted() で要素を昇順に並べ替え、Collectors.joining でカンマ区切り文字列に整形するテクニックを身につけよう。

  • distinct で重複排除

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

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

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

  • リスト順序付きで複数の値を扱うデータ構造
  • 配列サイズ固定の同型データの集まり
  • クラスデータと振る舞いを束ねる単位
  • 戻り値呼び出し元への返答を表す点線矢印
  • instanceof「このオブジェクトの実際の型は何か」を確認 → 安全に変換
  • ループ繰り返し処理。矢印で戻すか専用記号で示す
main.java
学習モード
エディタを読み込んでいます

メモ

map で変換する

⌘S で保存