目錄
寫在前面
一、常見寫法
二、@FunctionalInterface注解
三、default方法
四、jdk8自帶的函數接口(重點)
Predicate
Consumer
Function
Supplier
BiFunction
jdk提供了很多基本資料類型的類,可以直接使用不需要加泛型
執行個體
寫在前面
本文主要是介紹jdk8自帶的函數接口,預設認為讀者已經了解或接觸過lambda函數基礎。
學習jdk8自帶的函數接口,主要是為了進一步學習stream流式程式設計。
一、常見寫法
interface Interface1 {
int doubleNum(int i);
}
public static void main(String[] args) {
Interface1 i1 = (i) -> i * 2;
Interface1 i2 = i -> i * 2;
Interface1 i3 = (int i) -> i * 2;
Interface1 i4 = (int i) -> {
System.out.println("-----");
return i * 2;
};
}
二、@FunctionalInterface注解
lambda表達式實作的接口,必須有且僅有一個要實作的方法,使用@FunctionalInterface注解标注之後,如果不符合lambda接口格式,會編譯報錯。
@FunctionalInterface
interface Interface1 {
int doubleNum(int i);
}
三、default方法
java8可以在接口中編寫default預設實作的方法。
若兩個接口,都有一個相同的名稱、參數的default方法,兩個接口被同一個類實作之後,這個類必須要重寫這個default方法(編譯期就會報錯)。
@FunctionalInterface
interface Interface1 {
int doubleNum(int i);
default int add(int x, int y) {
return x + y;
}
}
四、jdk8自帶的函數接口(重點)
Predicate
核心方法:
boolean test(T t);
輸入一個任意類型的參數,輸出一個boolean類型。
Consumer
核心方法:
void accept(T t);
輸入一個任意類型的參數,無輸出。
Function
核心方法:
R apply(T t);
輸入一個任意類型的參數,輸出一個任意類型的參數。
Supplier
核心方法:
T get();
無輸入參數,輸出一個任意類型的參數。
BiFunction
核心方法:
R apply(T t, U u);
jdk提供了很多基本資料類型的類,可以直接使用不需要加泛型
執行個體
import java.text.DecimalFormat;
import java.util.function.Function;
class MyMoney {
private final int money;
public MyMoney(int money) {
this.money = money;
}
// jdk8自帶的接口,Integer為入參,String為出參
public void printMoney(Function<Integer, String> moneyFormat) {
System.out.println("我的存款:" + moneyFormat.apply(this.money));
}
}
public class MoneyDemo {
public static void main(String[] args) {
MyMoney me = new MyMoney(99999999);
Function<Integer, String> moneyFormat = i -> new DecimalFormat("#,###")
.format(i);
// 函數接口鍊式操作
me.printMoney(moneyFormat.andThen(s -> "人民币 " + s));
}
}
// 執行結果:
// 我的存款:人民币 99,999,999
public static void main(String[] args) {
// 斷言函數接口
IntPredicate predicate = i -> i > 0;
System.out.println(predicate.test(-9));
// IntConsumer,jdk中自帶一些基本資料類型的,就不需要寫泛型了
// 消費函數接口
Consumer<String> consumer = s -> System.out.println(s);
consumer.accept("輸入的資料");
}