前回はコマンドライン引数を使ってプログラムの動作を外から制御する方法を学びました。
今回は「var(型推論)」について解説します。 Java 10から導入された var を使うことで、型名を明示せずに変数を宣言できるようになり、コードがよりすっきり書けるようになります。
varの基本
これまで変数を宣言するときは、必ず型名を書いていました。
String name = "ぱんまる";
int age = 25;
List<String> names = new ArrayList<>();
Java 10から導入された var を使うと、右辺の値からコンパイラが型を自動的に推論してくれるため、型名を省略して書けます。
var name = "ぱんまる"; // String と推論される
var age = 25; // int と推論される
var names = new ArrayList<String>(); // ArrayList<String> と推論される
var はあくまでコンパイル時に型が決まる「型推論」であり、型がなくなるわけではありません。一度 var name = "ぱんまる" と宣言したら、その後 name = 100 のように別の型の値を代入するとコンパイルエラーになります。
サンプルコード(varの基本的な使い方)
ファイル作成
「Java26」フォルダに VarTest.java という名前でファイルを作成します

コード入力
以下のコードを入力します。
import java.util.ArrayList;
import java.util.HashMap;
public class VarTest {
public static void main(String[] args) {
// 基本的な型推論
var name = "ぱんまる";
var age = 25;
var height = 170.5;
var isStudent = true;
System.out.println("名前: " + name);
System.out.println("年齢: " + age);
System.out.println("身長: " + height);
System.out.println("学生?: " + isStudent);
// ArrayListとHashMapでの使用
var names = new ArrayList<String>();
names.add("ぱんまる");
names.add("たろう");
names.add("はなこ");
var scoreMap = new HashMap<String, Integer>();
scoreMap.put("ぱんまる", 90);
scoreMap.put("たろう", 75);
scoreMap.put("はなこ", 85);
System.out.println("\n名前リスト: " + names);
System.out.println("スコアマップ: " + scoreMap);
// for文での使用
System.out.println("\n--- 全員のスコア ---");
for (var entry : scoreMap.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue() + "点");
}
}
}

コンパイル
javac VarTest.java

実行
java VarTest
実行結果は次のようになります。
名前: ぱんまる
年齢: 25
身長: 170.5
学生?: true
名前リスト: [ぱんまる, たろう, はなこ]
スコアマップ: {たろう=75, はなこ=85, ぱんまる=90}
--- 全員のスコア ---
たろう: 75点
はなこ: 85点
ぱんまる: 90点

サンプルコード(varとコレクション・Stream APIの組み合わせ)
ファイル作成
「Java26」フォルダに VarStreamTest.java という名前でファイルを作成します

コード入力
以下のコードを入力します。
import java.util.List;
import java.util.stream.Collectors;
public class VarStreamTest {
public static void main(String[] args) {
var scores = List.of(85, 92, 78, 65, 90, 55, 88);
// 70点以上を絞り込む
var passing = scores.stream()
.filter(score -> score >= 70)
.collect(Collectors.toList());
System.out.println("全スコア: " + scores);
System.out.println("70点以上: " + passing);
// 平均を求める
var average = scores.stream()
.mapToInt(Integer::intValue)
.average()
.orElse(0);
System.out.println("平均点: " + average);
// try-with-resources でのvar使用
var message = String.format("合格者数: %d人 / 平均点: %.1f点", passing.size(), average);
System.out.println(message);
}
}

コンパイル
javac VarStreamTest.java

実行
java VarStreamTest
実行結果は次のようになります。
全スコア: [85, 92, 78, 65, 90, 55, 88]
70点以上: [85, 92, 78, 90, 88]
平均点: 79.0
合格者数: 5人 / 平均点: 79.0点

varを使うべき場面・避けるべき場面
var は便利ですが、使い方によってはコードが読みにくくなることもあります。
使うと効果的な場面として、右辺を見れば型が明らかな場合があります。
var list = new ArrayList<String>(); // ArrayListと明らか
var map = new HashMap<String, Integer>(); // HashMapと明らか
また、型名が長くて冗長な場合も有効です。
// varを使わない場合
Map.Entry<String, List<Integer>> entry = ...;
// varを使う場合
var entry = ...;
一方、避けた方がよい場面として、右辺だけでは型がわかりにくい場合があります。
var result = getValue(); // getValueが何を返すかわからない
var x = 0; // intかlongかdoubleかわかりにくい
また、クラスのフィールド(メンバ変数)やメソッドの引数・戻り値には var は使えません。
// これはコンパイルエラー
class MyClass {
var name = "ぱんまる"; // フィールドにはvarは使えない
}
コードの解説
var を使っても、コンパイル後には通常の型宣言と同じバイトコードが生成されます。つまり var はあくまで書き方を省略するためのもので、実行時のパフォーマンスには影響しません。
for (var entry : scoreMap.entrySet()) のように、拡張for文の変数にも var が使えます。Map.Entry<String, Integer> のように型名が長い場合に特に効果的です。
List.of(85, 92, 78, ...) は変更不可のリストをシンプルに作る書き方で、Java 9から使えます。new ArrayList<>() のように後から要素を追加する必要がない場合に使うと便利です。
String.format("合格者数: %d人 / 平均点: %.1f点", count, avg) は、C言語の printf に似た書式指定でフォーマットされた文字列を作ります。%d が整数、%.1f が小数点1桁の浮動小数点数を表します。
まとめ
var を使うことで、右辺から型が明らかな場合に型名の記述を省略でき、コードがすっきりします。特にコレクションの宣言や拡張for文での変数宣言で効果的です。ただし、右辺を見ただけでは型がわかりにくい場面では、あえて型を明示した方がコードの読みやすさが上がる場合もあります。フィールドやメソッドの引数・戻り値には使えない点も覚えておきましょう。var はコードを短くするための道具ではなく、読みやすさを高めるために使うものだという意識が大切です。
2026/07/17(金) ぱんまる


コメント