文章目錄
一、函數式接口
- 定義:有且僅有一個抽象方法的接口
- 定義解釋:
1、爲什麼要求有且僅有一個抽象方法?
只有確保接口中有且僅有一個抽象方法,Java中的Lambda才能順利地進行推導,因爲Java中的Lambda可以被當做是匿名內部類的“語法糖”(見第2點),但是二者在原理上不同。
2、什麼是語法糖?
“語法糖"是指使用更加方便,但是原理不變的代碼語法。例如在遍歷集合時使用的foreach語法,其實底層的實現原理仍然是迭代器,這便是“語法糖”。從應用層面來講,Java中的Lambda可以被當做是匿名內部類的“語法糖”,但是二者在原理上是不同的。
3、匿名內部類?
這裏簡單舉個例子,如果你完全不懂什麼是匿名內部類還要去查相關資料
例如,一個方法需要一個類的對象作爲參數,但是你只有這個類的接口,不想因爲某個方法單獨寫具體的實現類,這時你可以通過”匿名內部類“來實現這個接口來實現傳參,而不必單獨的去實現這個類。
匿名內部類示例:
//peolpe類
public interface People {
public abstract String getName();
}
//car類
public class Car {
//driveCar方法需要people類的實例
public String driveCar(People people) {
return people.getName() + " driving car !";
}
public static void main(String[] args) {
Car car = new Car();
String whoDrivingCar = car.driveCar(
//people的匿名內部類
new People() {
@Override
public String getName() {
return "lbw";
}
});
System.out.println(whoDrivingCar);
}
}
- 應用:一般作爲方法的參數或者方法的返回值
- 函數式接口改造示例:
給接口加上@FunctionalInterface註解保證有且僅有一個抽象方法
@FunctionalInterface
public interface People {
public abstract String getName();
}
將匿名內部類改寫成lambada的簡化寫法
public class Car {
public String driveCar(People people) {
return people.getName() + " driving car !";
}
public static void main(String[] args) {
Car car = new Car();
String whoDrivingCar = car.driveCar(
//匿名內部類
//()裏寫參數
//->lambada符號
//{}裏寫實現
() -> {
return "lbw";
});
System.out.println(whoDrivingCar);
}
}
- 常用的函數式接口:
1、生產型Supplier:返回泛型中指定類型的數據
public class SupplierTest {
//泛型爲string
public static String getName(Supplier<String> supplier) {
return supplier.get();
}
public static void main(String[] args) {
//返回String
String name = getName(() -> {
return "小明";
});
System.out.println(name);
}
}
2、消費型:Consumer:消費泛型中指定類型數據
ublic class ConsumerTest {
// 反轉字符串
public static void reverseString(String name, Consumer<String> consumer) {
consumer.accept(name);
}
public static void main(String[] args) {
reverseString("1234567", (String name) -> {
System.out.println(new StringBuffer(name).reverse().toString());
});
}
}
3、轉換型Function:將前者類型轉換爲後者類型
public class FunctionTest {
public static Integer transfer(String string, Function<String, Integer> function) {
return function.apply(string);
}
public static void main(String[] args) {
System.out.println(
transfer("100",
(String string) -> {
return Integer.parseInt(string);
}));
}
}
4、真假型Predicate:對傳入數據進行判斷,得到Boolean類型結果
public class PredicateTest {
public static boolean isFlag(String string, Predicate<String> predicate) {
return predicate.test(string);
}
public static void main(String[] args) {
boolean flag = isFlag("奧利粵", (string) -> {
return "奧利奧".equals(string);
});
System.out.println(flag==true?"真的奧利奧":"假的奧利奧");
}
}