在之前的一片博文 Lambda 表達式,提到過Java 8提供的函數式接口。在此文中,將介紹一下Java 8四個最基本的函數式接口
對於方法的引用,嚴格來講都需要定義一個接口。不管我們如何操作實際上有可能操作的接口只有四種。
Java 8 提供了函數式接口包java.util.function.*,在該包下有許多Java 8內建的函數式接口。不過基本上分為四種基本的:
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
public static void main(String[] args) {
// 這裡用到了Java8的 方法引用,功能型函數式接口!
Function<String,Boolean> function = "Hello Java" :: endsWith;
System.out.println(function.apply("Java"));
}
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
class TestDemo{
//此方法沒有返回值,但是有輸入參數
public void fun(String str){
System.out.println(str);
}
}
public class TestFunctional {
public static void main(String[] args) {
TestDemo demo = new TestDemo();
//消費型接口,只有輸入參數,沒有輸出參數
Consumer<String> consumer = demo :: fun;
consumer.accept("");
}
}
@FunctionalInterface
public interface Supplier<T> {
T get();
}
public class TestFunctional {
public static void main(String[] args) {
//供應商類型接口,只有輸出參數,沒有輸入參數!
Supplier<String> supplier = "java 8" :: toUpperCase;
System.out.println(supplier.get());
}
}
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
public class TestFunctional {
public static void main(String[] args) {
//斷言類型接口。有輸入參數,輸出參數為布爾值
Predicate<String> predicate = "Android" :: equalsIgnoreCase;
System.out.println(predicate.test("android"));
}
}
所以在Java 8中由於存在有以上的四個功能型接口,所以一般很少會由用戶去定義新的函數式接口!