函數式程式設計語言操縱代碼片段就像操作資料一樣容易。 雖然 Java 不是函數式語言,但 Java 8 Lambda 表達式和方法引用 (Method References) 允許你以函數式程式設計。
Lambda 函數式程式設計、
Java雖然是屬于面向對象的語言,但是在JDK1.8之後加用了Lambda函數式,使複雜的程式結構變得簡潔易懂 ~
兩種的不同
面向對象:(Object Oriented)
解決某個問題時,首先找出解決問題的對象,然後通過調用對象的方法去解決。(注重的是結局的過程)
函數式:(Functional Programming)
隻擷取結果(不重視過程)
體驗Lambda的更優寫法:
借助Java 8 的全新文法,上述Runnabel 接口的匿名内部類寫法可以通過更簡單的Lambda表達式等效完成!
普通的匿名内部類方法
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+ "我是個好人 ");
}
}).start();
```
** 函數式Lambda的方法(無參)**
```java
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"我愛學習JAVA ");
}){
}.start();
結果如下:
匿名内部類的優缺點
**優點:**省去了實作類的定義。
**不足:**内部類的結構複雜,可讀性不是很好。
Lambda 結構 由三部分組成:
- 一個參數 () 接口中抽象方法的方法參數,沒有就空着,有多個就用逗号隔開
- 一個箭頭 -> 将參數傳遞給方法體
-
一段邏輯代碼 重寫接口抽象方法的方法體
(參數清單) -> { 重寫的邏輯代碼}
執行個體 一:
使用數組儲存多個Person 對象
對數組中的對象用 Arrays . sort方法 對對象的年齡進行排序
一:先定義一個Person類 其實 不用這麼 麻煩 get set toString 就OK
package Thread2_Lambda;
public class Person_01 {
private String name ;
private int age ;
public Person_01(){
}
public Person_01(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person_01{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
然後在建立一個數組 用來儲存對象的資訊–>Arrays.sort排列數組–>周遊得出結論
public class Demo01_Person01 {
public static void main(String[] args) {
Person_01 arr [] = {
new Person_01("小美",20),
new Person_01("紅紅",16),
new Person_01("迪麗熱巴",19),
new Person_01("鞠經緯",22)
};
一:匿名内部類的方法實作:
//利用Arrays.sort 方法(前邊 - 後邊)對其排序
// 原始方法
Arrays.sort(arr, new Comparator<Person_01>() {
@Override
public int compare(Person_01 o1, Person_01 o2) {
return o1.getAge()-o2.getAge();
// 升序排序 年齡
}
});
// 周遊數組
for(Person_01 p : arr) {
System.out.println(p);
}
二:Lambda的簡便方法:
這裡面的()内要傳遞參數 ,對于多個參數的
// 利用Lambda 進行數組排序 ,簡化匿名内部類 ()-> 裡面有參數 分别為 Person_01 o1 ,Person_01 o2
Arrays.sort(arr,(Person_01 o1 ,Person_01 o2 )->{
return o1.getAge()-o2.getAge();
});
再周遊一下 :和上面一樣 這裡不再贅述。
運作結果:(#^. ^#) 這裡的年齡哈哈哈哈可能有點飄~~
執行個體 二:
先 interface 三個接口 —> 然後通過接口名去調用方法即可
/**
* Functional Programming
* BY Howe
*/
// 先建立三個接口
interface Description{
String brief();
}
interface Body {
String detailed(String head );
}
interface Multi{
String twoArg(String head, Double d);
}
public class LambdaDemo2_FromJava_8 {
static Body body = h -> h + "Is a good MAN ! ";
static Body body2 = h -> h + " Love Java ! ";
static Multi mu = (h,d)-> h + d;
static Description desc = () -> "short info";
static Description morelines = () -> {
System.out.println("我是個好人@*@");
return "我是個 Java 小菜鳥 ";
};
public static void main(String[] args) {
System.out.println(body.detailed("Howe "));
System.out.println(body2.detailed(" 張 "));
System.out.println(desc.brief()); // 為空
System.out.println(mu.twoArg("Howe",666.666));
System.out.println(morelines.brief());
}
}
結果:
這裡有個要關注點:對于body 和 body1 隻有一個參數時,可以省略 () ,但 這是一個特例。(我們不能搞特殊化)
通常情況下不管是否有參數都是要帶 (),為了追求一緻性。
對于多個參數,将參數清單放在括号 ( ) 中
到目前為止,所有 Lambda 表達式方法體都是單行。 該表達式的結果自動成為 Lambda 表達式的傳回值,在此處使用 return 關鍵字是非法的。 這是 Lambda 表達式簡化相應文法的另一種方式。
如果在 Lambda 表達式中确實 需要多行 ,則必須将這些行放在花括号 { } 中。 在這種情況下,就需要使用 return。
總結:三個重點 ( ) 、-> 、 { }