天天看點

Lambda函數式程式設計(一)

函數式程式設計語言操縱代碼片段就像操作資料一樣容易。 雖然 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函數式程式設計(一)

匿名内部類的優缺點

**優點:**省去了實作類的定義。

**不足:**内部類的結構複雜,可讀性不是很好。

Lambda 結構 由三部分組成:

  1. 一個參數 () 接口中抽象方法的方法參數,沒有就空着,有多個就用逗号隔開
  2. 一個箭頭 -> 将參數傳遞給方法體
  3. 一段邏輯代碼 重寫接口抽象方法的方法體

    (參數清單) -> { 重寫的邏輯代碼}

執行個體 一:

使用數組儲存多個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();
            });
           

再周遊一下 :和上面一樣 這裡不再贅述。

運作結果:(#^. ^#) 這裡的年齡哈哈哈哈可能有點飄~~

Lambda函數式程式設計(一)
執行個體 二:

先 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());
    }
}

           

結果:

Lambda函數式程式設計(一)

這裡有個要關注點:對于body 和 body1 隻有一個參數時,可以省略 () ,但 這是一個特例。(我們不能搞特殊化)

通常情況下不管是否有參數都是要帶 (),為了追求一緻性。

對于多個參數,将參數清單放在括号 ( ) 中

到目前為止,所有 Lambda 表達式方法體都是單行。 該表達式的結果自動成為 Lambda 表達式的傳回值,在此處使用 return 關鍵字是非法的。 這是 Lambda 表達式簡化相應文法的另一種方式。

如果在 Lambda 表達式中确實 需要多行 ,則必須将這些行放在花括号 { } 中。 在這種情況下,就需要使用 return。

總結:三個重點 ( ) 、-> 、 { }

加油!!!