上期我們分析了Java8中Interface的相關新特性,其中包括函式式介面,可以在呼叫時,使用一個Lambda表示式作為引數,那麼我們就來談談Java8中的Lambda表示式吧。
定義
Lambda表示式基於函式式介面實現,故可以認為Lambda表示式是對函式式介面的匿名內部類的一種簡寫形式。
格式
Lambda表示式的具體形式為:()->{}
箭頭表示式->
將Lambda表示式分為了左右兩部分,左側為引數列表,右側為具體實現,即Lambda體。
具體有以下以及情形:
1. 無引數無返回值
Runnable runnable = () -> {
System.out.println("run");
};
複製程式碼
2. 有一個引數無返回值
public interface MyInterface {
void test(int x);
}
MyInterface i = (x) -> System.out.println(x);
複製程式碼
3. 只要一個引數,小括號可以不寫
MyInterface i = x -> System.out.println(x);
複製程式碼
4. 有多個引數有返回值,並且Lambda體有多條語句
Comparator<Integer> comparator = (x, y) -> {
System.out.println("Comparator");
return Integer.compare(x, y);
};
複製程式碼
5. Lambda體中只有一條語句,return和{}可以省略
Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);
複製程式碼
6. Lambda 表示式的引數列表的資料型別可以省略不寫,因為JVM編譯器通過上下文推斷出,資料型別,即“型別推斷”
Comparator<Integer> comparator = (Integer x, Intergery) -> Integer.compare(x, y);
Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);
複製程式碼
總結:
- 引數型別可忽略,若寫所有引數都要寫,若不寫,可以型別推斷
- 引數有且僅有一個時,
()
可以省略 - Lambda體只有一條語句,
return
和{}
都可忽略
Java8內建四大核心函式式介面(java.util.function.*包)
- Consumer 消費型介面
public static void main(String[] args) {
String str = "str";
consumer(str, s -> System.out.println(s));
}
public static void consumer(String str, Consumer<String> function) {
function.accept(str);
}
複製程式碼
- Supplier 供給型介面
public static void main(String[] args) {
supplier(() -> "str");
}
public static String supplier(Supplier<String> function) {
return function.get();
}
複製程式碼
- Function<T, R> 函式型介面
public static void main(String[] args) {
String str = "str";
function(str, s -> s);
}
public static String function(String str, Function<String, String> function) {
return function.apply(str);
}
複製程式碼
- Predicate 斷定型介面
public static void main(String[] args) {
String str = "str";
predicate(str, s -> s.isEmpty());
}
public static boolean predicate(String str, Predicate<String> function) {
return function.test(str);
}
複製程式碼
Lambda表示式就到這裡了,一開始用起來會不習慣,用多了上手起來就熟練了,而且越用越信手拈來。
下期我們將分析用引用方式簡寫Lambda表示式,敬請期待。