javaのvarの使い方
javaのvarの使い方 ラムダ式編
変数・配列・Collectionはこちら 拡張for文編はこちら 注意点はこちら
変数・配列・Collectionに引き続き、ラムダ式(と、匿名クラス)でローカル変数型推論を利用した際の忘備録。
なお、本記事も、ひしだまのホームページ(外部リンク)様のこちらの記事を参考に、手元の環境で試した内容をもとに執筆しております。
javaの環境について
javaの環境は以下の通りです。
javaのバージョン
openjdk version “11” 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)
javac 11
プログラムを実行する際は自己責任で実行してください。
以上、お約束のやつ終わり!
それでは早速行ってみよう!
サンプルプログラム
構文確認
サンプルプログラムの前に、ローカル変数型推論を使った際の構文の確認。
var 変数名 = 値; //OK //var 変数名; //コンパイルエラー
通常の変数と異なり、 変数宣言時に必ず値を代入しないといけない ので注意!
構文を確認できたところで、使用例に行ってみよう♪
匿名クラスとラムダ式
//匿名クラスの場合、型推論が効くのでOK
var f1 = new Runnable(){
@Override
public void run(){
System.out.println("f1.run()");
}
};
//ラムダ式の場合、そのままでは型推論が効かないのでダメ。
//var f2 = () -> System.out.println("f2.run()");
//ラムダ式の場合でも、キャストすればOK
var f3 = (Runnable)() -> System.out.println("f3.run()");
匿名クラスではキャスト不要 だが、 ラムダ式の場合はキャストが必要 。
また、匿名クラスとラムダ式の場合で、以下のような違いもある。
//匿名クラスの場合
var f1 = new Runnable(){
@Override
public void run(){
System.out.println("f1.run()");
}
};
/*
//再度匿名クラスを実装して代入するとコンパイルエラー
f1 = new Runnable(){ //コンパイルエラー
@Override
public void run(){
System.out.println("f1.run()#2");
}
};
*/
//ラムダ式の場合
var f3 = (Runnable)() -> System.out.println("f3.run()");
//ラムダ式での場合、再代入可能。
f3 = (Runnable)() -> System.out.println("f3.run()#2");
以下、私見。
上記の違いは、匿名クラスで実装した場合はデータ型が「実装するごとに、元のクラス(インタフェース)を継承した新しいクラス」になるのに対して、ラムダ式の場合はキャストによってデータ型が「キャスト後のクラス(インタフェース)」になるため、と思われる。が、真相は闇の中(@_@)
メソッド参照
//var mr1 = "abc"::equals; //データ型の推論が効かない。キャストが必要。 var mr2 = (Predicate)"abc"::equals; //OK。 //var mr3 = (Boolean)"abc"::equals; //NG。メソッド参照なので、Boolean型ではなくPredicate型。
メソッド参照を利用する場合も、 データ型のキャストが必要 になるので注意。
上記の例ではメソッドそのものの戻り値ではなく、そのメソッドの 引数と戻り値に対応した関数型インタフェースにキャストしなければいけない ので注意。
うっかりBoolean型にキャストして小一時間悩んだのは内緒(@_@)
おまけ:for文
//for文の場合
//初期化部分で使用可能
for(var i = 0; i < 3; i++){
System.out.print(i);
}
//ただし、初期化部分で複合宣言はできない。
/*for(var i = 0, j = 0; i < 3; i++){
System.out.println(i + "-" + j);
}*/
for文の宣言部分でも使用可能。通常の変数同様に、 複合宣言できない ので注意。
以上、ラムダ式編でした♪
オススメ!!→ java 11 の問題はこちら オススメ!!→ java のローカル変数型推論(var)の使い方はこちら 注意点はこちら オススメ!!→ java 8 の問題はこちら オススメ!!→ javaのプログラム作成練習問題はこちら オススメ!!→ java関連の記事はこちら