Java ラムダ式の使い方
■ラムダ式とは
メソッド定義を式として扱える機能である
関数型インターフェースを実装するための記述を簡潔に書くことができる
※関数型インターフェース:抽象メソッドを1つ持つインターフェース
■基本構文
インターフェース名 オブジェクト名 = (引数1, 引数2, ・・・) -> {return 処理内容};
引数が1つならカッコ()は省略可
処理内容が1行なら「return」と「波カッコ{}」の代わりに式を記述する
※式の結果が戻り値となる
■シンプルなラムダ式
・Hello.java(関数型インターフェース)
package sample;
public interface Hello {
public void getHello();
}
・Main.java
package sample;
public class Main {
public static void main(String[] args) {
Hello hello = () -> System.out.println("Hello World!");
hello.getHello();
}
}
引数を持つラムダ式
・Hello.java(関数型インターフェース)
package ample;
public interface Hello {
public void getHello(String str);
}
package sample;
public class Main {
public static void main(String[] args) {
Hello hello = str -> System.out.println("Hello World " + str);
hello.getHello("again!");
}
}
複数の引数と複数行のラムダ式
・Hello.java(関数型インターフェース)
package sample;
public interface Hello {
public void getHello(String name, String reply);
}
package sample;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
Hello hello = (name, reply) -> {
//引数をリストにセット
List<String> list = new ArrayList<>();
list.add(name);
list.add(reply);
//メソッド参照でコンソール出力
list.forEach(System.out::print);
};
hello.getHello("Hi,Mike!", " How are you?");
}
}
■ラムダ式を利用してディレクトリを再帰的に取得
package sample;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public final class Main {
public static void main(final String... args) {
final File file = new File("ディレクトリパス");
//指定したディレクトリ内のディレクトリを再帰的に取得
List<File> files = getSubDir(file);
files.stream().forEach(f -> System.out.println(f.getPath()));
}
/***
*指定したディレクトリ内のディレクトリを再帰的に取得
* @param targetDir
* @return dirPath
*/
private static List<File> getSubDir(final File... targetDir) {
final List<File> dirPath = new ArrayList<>();
//配列からStreamを取得
Stream.of(targetDir).forEach(file -> {
//ディレクトリ内のサブディレクトリの抽象パス名の配列を返す
final File[] dirs = file.listFiles(f -> file.isDirectory());
// 再帰的にディレクトリを取得
dirPath.addAll(getSubDir(dirs));
dirPath.addAll(Arrays.asList(dirs));
});
return dirPath;
}
}