– 面向過程程序語言:參數傳遞是基本類型的變量
– 面嚮對象語言:
- 傳遞基本類型的變量
- 傳遞對象變量
– 函數式程序語言設計:傳遞方法 / 代碼塊
即允許把函數作爲一個方法的參數(函數作爲參數傳遞進方法中)–>> Lambda 表達式–> Java 8 發佈的新特性,引入了一個新的操作符 " -> " 該操作符稱爲箭頭操作符或 Lambda 操作符
使用 Lambda 表達式可以使代碼變的更加簡潔緊湊。
lambda 表達式的語法格式:
- 參數,箭頭,一個表達式
(parameters) -> expression
- 參數,箭頭,{多個語句}
(parameters) ->{ statements; }
lambda表達式的重要特徵:
- 類似匿名方法,一個沒有名字的方法
- 不需要聲明參數類型,編譯器可以統一識別參數值
- 堅決不聲明返回值類型
- 沒有 public/protected/private/static/final 等修飾符
- 單句表達式,將直接返回值,不用大括號
- 帶 return 語句, 算多句,必須用大括號(不用void()聲明)
如果有返回值,返回值類型會在上下文推斷出來的,無需聲明,只在某幾個分支有返回值,是不合法的
x ->
{
if(x>0)
return x+1;
};
數組字符串排序實例
package com.lambda;
import java.util.Arrays;
//doc:StringOrderTest.java
public class StringOrderTest {
public static void main(String[] args) {
String[] planets = new String[] {
"Mercury", "Venus", "Earth", "Mars",
"Jupiter", "Saturn", "Uranus","Neptune" };
System.out.println(Arrays.toString(planets)); //返回指定數組的內容的字符串表示形式
System.out.println("=======================");
System.out.println("使用長度從小到大的比較器:");
Arrays.sort(planets, new LengthAscComparator()); //按照數字順序排列指定的數組
System.out.println(Arrays.toString(planets));
System.out.println("使用長度從大到小的比較器:");
Arrays.sort(planets, new LengthDescComparator());
System.out.println(Arrays.toString(planets));
System.out.println("=======================");
System.out.println("使用Lambda, 長度從小到大:");
Arrays.sort(planets,
(String first, String second)
-> first.length() - second.length());
System.out.println(Arrays.toString(planets));
System.out.println("使用Lambda, 長度從大到小:");
Arrays.sort(planets, (first, second) -> (-1) * (first.length() - second.length()));
System.out.println(Arrays.toString(planets));
System.out.println("使用Lambda, 長度從大到小:");
Arrays.sort(planets,
(String first, String second) -> {
int result = (-1) * (first.length() - second.length());
return result;
}
);
System.out.println(Arrays.toString(planets));
System.out.println("=======================");
//無參數,僅保留括號,箭頭和表達式
new Thread(
() -> {
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum = sum + i;
}
System.out.println("總和:" + sum);
}
).start();
}
}
package com.lambda;
import java.util.Comparator; //比較器,Comparator接口實現自定義排序
//doc:LengthAscComparator.java
public class LengthAscComparator implements Comparator<String> {
public int compare(String first, String second) {
//獲取2個字符串長度
int len1 = (first==null? 0 : first.length());
int len2 = (first==null? 0 : second.length());
//如果len1 == len2,返回0,表示兩個字符串相等
//如果len1 > len2,返回正數,表示first>second
//如果len1 < len2,返回負數,表示first<second
return len1 - len2;
}
}
package com.lambda;
import java.util.Comparator;
//doc:LengthDescComparator.java
public class LengthDescComparator implements Comparator<String> {
public int compare(String first, String second) {
//獲取2個字符串長度
int len1 = (first==null? 0 : first.length());
int len2 = (first==null? 0 : second.length());
//如果len1 == len2,返回0,表示兩個字符串相等
//如果len1 > len2,返回正數,表示first>second
//如果len1 < len2,返回負數,表示first<second
return (-1) * (len1 - len2);
}
}
運行結果:
函數式接口 (Functional Interface)
- 只包含一個抽象方法的接口
- 可以包括其他的 default 方法、 static 方法、 private 方法
- 由於只有一個未實現的方法,所以 Lambda 表達式可以自動填上這個尚未實現的方法
- 採用 Lambda 表達式,可以自動創建出一個( ( 僞) ) 嵌套類的對象( ( 沒有實際的嵌套類 class 文件產生) ),然後使用,比真正嵌套類 更加輕量 ,更加簡潔高效
上例中 - - >> Lambda 表達式( ( 匿名函數) ) 自動成爲接口方法的實現
Lambda 表達式:自動填充上Comparator的compare方法,變成一個Comparator的子對象
若不用Lambda 表達式,可採用匿名內部類:相對不夠簡潔,還會產生額外的嵌套類的class文件(含$符號的文件)
java.utils包下的Comparator接口。該接口代表一個比較器,java數組工具類和集合工具類中提供對sort方法排序就是使用 Comparator接口來處理排序的。
Comparator接口中有一個方法int compare(T o1, T o2)。這個方法返回值是int類型,
如果返回值小於0,說明比較結果是o1<o2,
如果返回值等於0,說明比較結果是o1=o2,
如果返回值大於0,則說明比較結果是o1>o2。
自定義函數式接口時,可寫上系統自帶的函數式接口註解,用於編譯器檢查:
@FunctionalInterface
函數式接口的優缺點:
- 只帶有一個未實現的方法,內容簡單
- 大量重複性的函數式接口,使得源碼膨脹
爲避免源碼膨脹,可採用系統自帶的函數式接口
- 涵蓋大部分常用的功能,可以重複使用
- 位於 java.util.function 包中
Java內置的四大函數式接口:
方法引用: Method Reference
Lambda 表達式支持傳遞現有的類庫函數