■ 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! } }
参考文献
http://www.atmarkit.co.jp/ait/articles/1404/30/news017.htmlhttp://www.yoheim.net/blog.php?q=20160410