プログラミング逆引き辞典

~ 多言語対応のプログラミングレシピ ~

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;
    }
}