乾貨 JDK1.8 Lambda表達式詳細介紹和使用以及如何自定義Lambda

一:簡介

JDK的升級的目的有以下幾個:增加新的功能、修復bug、性能優化、簡化代碼等幾個方面,Lambda表達式就是屬於簡化代碼,用於簡化匿名實現類,提供一種更加簡潔的寫法。Lambda表達式在Swift語言中稱之為代碼塊,Lambda表達式可以認為是一種特殊的接口,該接口必須只有一個抽象方法。


乾貨 JDK1.8 Lambda表達式詳細介紹和使用以及如何自定義Lambda


語法

<code>(參數類型 參數名, 數參數類型 參數名2...) -> { 
// code
};
/<code>

小括號()中的內容就是方法中的參數列表包括參數類型、參數名,其中參數類型是可以省略的,當參數個數只有一個時也可以省略掉小括號; 花括號{}中的內容就是方法中的方法體,當方法體中只有一行代碼時可以省略{},當方法體中只有一行代碼並且需要返回值時也可以省略掉return; 由於Lambda表達式是匿名實現類的簡寫,是一種特殊的接口,當賦值給一個變量時也少不掉分號;

Lambda表達式的作用

  • 簡化匿名實現類的書寫
  • 作為函數中的參數來傳遞

二:示例

示例1:兩個參數,一個返回值

IHello 一個很普通的接口,但接口中只能有一個抽象方法

<code>public interface IHello {
String sayHello(String name, String msg);
}
/<code>

Main

<code>public class Main {
public static void main(String[] args) {
// 將一個Lambda表達式賦值給一個接口,說明Lambda表達式就是一種接口數據類型,只不過該接口只能有一個抽象方法
// 參數列表可以省略參數類型,可以寫成(name, msg),
// 在JDK1.8中有個叫做類型推斷的東西,可以自動推斷出參數的類型,
// 因為IHello中只有一個抽象方法,知道方法了就知道參數列表了,從而就能推出參數類型來
IHello iHello = (String name, String msg) -> {
String hello = name + ": " + msg;
return hello;
};
// 調用接口的方法
String content = iHello.sayHello("mengday", "happy new year everyone!");
System.out.println(content);
}
}
/<code>

示例2:一個參數,一個返回值

<code>public interface IHello {
String sayHello(String name);
}
/<code>

Main

<code>public class Main {
public static void main(String[] args) {
// 參數列表可以省略參數類型,當只有一個參數時可以省略小括號 (String name) --> (name) --> name
// 當方法體中只有一行代碼並且有返回值時可以同時省略花括號和return
// { return name + ": " + "happy new year everyone!";} --> name + ": " + "happy new year everyone!";
IHello iHello = name -> name + ": " + "happy new year everyone!";

String content = iHello.sayHello("mengday");
System.out.println(content);
}
}
/<code>

示例3:沒有參數,沒有返回值

<code>public interface IHello {
void sayHello();
}
/<code>
<code>public class Main {
public static void main(String[] args) {
// 當表達式沒有參數時一對小括號是不能省略掉的
IHello iHello = () -> System.out.println("mengday: happy new year everyone!");
iHello.sayHello();
}
}
/<code>

從這三個示例中我們發現我們只定義了接口,並沒有定義實現類,而是通過Lambda表達式來代替了實現類。 注意:Lambda接口只能有一個抽象方法,可以同時擁有多個靜態方法和默認方法。


示例4:Lambda表達式參數

<code>public interface IHello {
void sayHello(String name);
}
/<code>
<code>public class Main {

public static void sayHello(IHello iHello, String name) {
iHello.sayHello(name);
}

public static void main(String[] args) {

IHello iHello = name -> {
String content = name + ": " + "happy new year everyone!";
System.out.println(content);
};

// 這裡可以把iHelo看成一個匿名實現類來傳遞參數
sayHello(iHello, "mengday");

// 如果去掉變量的接收,直接將Lambda表達式傳遞到參數中,此時Lambda表達式更像是一個函數
// 也就是說JDK1.8竟然可以將一個函數作為參數傳遞到方法中,這是之前版本做不到的
// 將函數作為方法的參數傳遞,一般用於回調函數,將回調函數傳遞到方法中
sayHello(name -> {
String content = name + ": " + "happy new year everyone!";
System.out.println(content);
}, "mengday");
}
}
/<code>

示例5:集合排序示例

<code>public static void main(String[] args) {

// 寫法一:使用匿名內部類
// 好好學習,天天向上
List<string> words = Arrays.asList("good", "good", "study", "day", "day", "up");

// public static void sort(List list, Comparator super T> c)
Collections.sort(words, new Comparator<string>() {
@Override
public int compare(String s1, String s2) {
// 降續排序
return s2.compareTo(s1);
}
});

System.out.println(words);


// 寫法二:使用Lambda表達式
// 咱倆誰跟誰
words = Arrays.asList("we", "two", "who", "and", "who");
Collections.sort(words, (String s1, String s2) -> {return s2.compareTo(s1);});
System.out.println(words);


// 寫法三:使用Lambda表達式(簡寫)
// 有事起奏,無事退朝
words = Arrays.asList("if", "you", "have", "something", "to", "say", "then", "say!",
"if", "you", "have", "nothing", "to", "say", "go", "home!");
Collections.sort(words, (s1, s2) -> s2.compareTo(s1));
System.out.println(words);
}/<string>
/<string>/<code>


分享到:


相關文章: