jdk1.8之後,所謂函數式接口是指在接口中只有一個抽象方法,可以使用 @FunctionalInterface註解來約束, 有多個抽象方式就好報錯;使用函數式接口,所以使用lambda表達式時,編譯器可以根據上下文找到對應的接口,方法, 確定參數類型. 函數式接口示例
@FunctionalInterface
public interface MyFunctionInterface {
/**
* 抽象方法
*/
void sayHello();
/**
* 函數接口可以有默認實現
*/
default void speakEnglish() {
System.out.println("hello everybody !");
}
}
java8有四大函數接口1.消費型接口Consumer,有參數無返回值
@Test
public void testConsumer() {
/**
* @name消費型接口
* @use Consumer<T>
* @Param T 傳入參數
* @fun 接受一個參數, 無返回值
*/
Consumer<String> con = (x) -> {
System.out.println("我消費了一個:" + x);
};
con.accept("蘋果");
}
2.供應式接口Supplier,無參數有返回值
@Test
public void testSupplier() {
/**
* @name 供應式接口
* @use Supplier<R>
* @Param R返回值類型
* @fun 無參數, 有返回值
*/
Supplier<Date> supplier = () -> new Date();
Date date = supplier.get();
System.out.println("獲得了一個供應的日期:" + date);
}
3.函數接口Function,有參數,有返回值/**
* @param T 傳入參數
* @return R 返回參數
* @name函數型接口
* @use Function<T , R>
* @fun 接收一個參數, 有返回值
*/
@Test
public void testFunction() {
Function<String, String> fun = (str) -> "hello," + str;
String tom = fun.apply("Tom");
System.out.println(tom);
}
4.斷定型接口Predicate,接受一個參數,返回布爾值/**
* @param T 入參
* @return Boolean 返回一個Boolean值
* @name 斷定型接口
* @use Predicate<T>
* @fun 接收一個參數, 返回一個Boolean值
*/
@Test
public void testPredicate() {
Predicate<Integer> predicate = (num) -> num > 0;
System.out.println(predicate.test(5));
}