ラムダ式基本構文
インターフェース名 オブジェクト名 = (引数1, 引数2, ・・・) ->{return 処理内容};
引数の型を記述する必要はない
→引数の型はコンパイラーによって類推されるから
従来通り型を記述してもコンパイルエラーになることもない
ラムダ式の引数が1つの場合
インターフェース名 オブジェクト名 = 引数 -> 処理 ;
引数が1つの場合は処理結果を返すreturnや引数群を囲む()、処理の記述を囲む{}を記述する必要はない
メソッド参照
メソッド参照:メソッドの引数としてメソッドを参照できる仕組み
書き方
・呼び出したいメソッド名の直前に::をつける
・その前にクラス名を記述
*メソッドの引数部分の()は省略
クラス名 :: メソッド名
ラムダ式での呼び出し
import java.util.ArrayList;
public class Sample{
public static void main(String args[1]{
ArrayList<Integer>list = new ArrayList<>();
for(int i = o; i < 10 ; i++){
list.add(i);
}
list.forEach(i -> System.out.print(i));
}
}
→ラムダ式でメソッドを呼び出している
結果
0123456789
メソッド参照での呼び出しについて
ラムダ式での参照をメソッド参照にしてみる↓
import java.util.ArrayList;
public class Sample2{
public static void main(String args[]) {
ArrayList<Integer> list = new ArrayList<>();
for(int i = 0 ; i < 10 ; i++) {
list.add(i);
}
list.forEach(System.out::print);
}
}
結果
0123456789
引数が複数の場合
メソッド参照やラムダ式の記述を使うときは、引数と戻り値に型が一致する関数型のインターフェースのオブジェクトに代入
import java.util.Comparator;
public class Sample3 {
public static void main(String args[]) {
Comparator<Integer> comp = Integer::compare;
System.out.println(comp.compare(1, 2));
}
}
結果
-1
Integer.compare() → Integer::compareと記述している
戻り値の扱い方
import java.util.function.IntSupplier;
public class Sample4 {
public static void main(String args[]) {
String str = "Hello";
IntSupplier is = str::length;
System.out.println(is.getAsInt());
}
}
結果
5
str.length() → str::length
関数型インターフェース IntSupplierのオブジェクトisに戻り値を代入
getAsIntメソッドで戻り値を取得
コンストラクタ参照
書き方
クラス名::new
import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;
class Sample5{
public static void main(String args[]){
Supplier<ArrayList<Integer>> supplier = ArrayList::new;
List<Integer> list = supplier.get();
for(int i = 0 ; i < 10 ; i++){
list.add(i);
}
list.forEach(System.out::print);
}
}
結果
0123456789
ArrayList::newでArrayList型のオブジェクトを生成
supplier.get()でList型のオブジェクトを取得