【Java】関数型インターフェイス

■ 関数型インタフェース

 * Java 1.8 から追加
 * 抽象メソッドを1つ持っているインターフェイス
 * defaultやstaticは対象外

■ FunctionalInterfaceアノテーション / @FunctionalInterface

API仕様
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/FunctionalInterface.html
 * 関数型インタフェースとすることを目的としていることを示すために使われる情報目的の注釈型
 * インタフェースが、java.lang.Objectのpublicメソッドの1つをオーバーライドする抽象メソッドを宣言する場合も、
   それはインタフェースの抽象メソッド数に反映されません
    => 理由は、そのインタフェースのいずれかの実装にjava.lang.Objectまたは他の場所からの実装が含まれるから
 * コンパイラは関数型インタフェースの定義を満たすどのインタフェースも関数型インタフェースとして扱います。

@FunctionalInterface
public interface IHelloWorld {
  String sayHello(String name);
}
NG (コンパイルエラー)
@FunctionalInterface
public interface IHelloWorld {
  String sayHello(String name);
  void hello(String name);
}

java.util.functionパッケージ

[1] Function<T,R> R apply(T t)

* 引数が1つで、戻り値がある
import java.util.function.Function;

public class Demo {
  public static void main(String[] args) {
    // Function
    Function<String, String> function = (name) -> {
      return "Hello, " + name + "!";
    };
    String result = function.apply("Mike");
    System.out.println(result); // Hello, Mike!
  }
}

[2] Consumer<T> void accept(T t)

* 引数が1つで、戻り値がない
import java.util.function.Consumer;

public class Demo {
  public static void main(String[] args) {
    // Consumer
    Consumer<String> consumer = (name) -> {
      System.out.println("Hi, " + name + "!!"); // Hi, Tom!!
    };
    consumer.accept("Tom");
  }
}

[3] Predicate<T> boolean test(T t)

引数が1つで、戻り値がboolean型
import java.util.function.Predicate;

public class Demo {
  public static void main(String[] args) {
    // Predicate
    Predicate<String> predicate = (name) -> {
      return "Kevin".equals(name);
    };
    String name = "Kevin";
    System.out.println("He is " + name + "? => " + predicate.test(name)); // He is Kevin? => true
  }
}

[4] Supplier<T> T get()

引数がなくて、戻り値がある
import java.util.function.Supplier;

public class Demo {
  public static void main(String[] args) {
    // Supplier
    Supplier<String> supplier = () -> {
      return "Happy New Year, Sam!";
    };
    System.out.println("Result => " + supplier.get()); // Result => Happy New Year, Sam!
  }
}


関連記事

Java】 匿名内部クラス / 無名内部クラス

https://blogs.yahoo.co.jp/dk521123/37174760.html

Java】メソッド参照

https://blogs.yahoo.co.jp/dk521123/37204926.html

Javaラムダ式 ~入門編~

https://blogs.yahoo.co.jp/dk521123/34188394.html