[Java學習筆記]JDK1.8新特性學習(一)Lambda表示式
java8 新特性
Java8 新增了非常多的特性,我們主要討論以下幾個:
- Lambda 表示式
- Lambda 允許把函式作為一個方法的引數(函式作為引數傳遞到方法中)。
- 方法引用
- 方法引用提供了非常有用的語法,可以直接引用已有Java類或物件(例項)的方法或構造器。與lambda聯合使用,方法引用可以使語言的構造更緊湊簡潔,減少冗餘程式碼。
- 預設(Default)方法
- 預設方法就是一個在介面裡面有了一個實現的方法。
- Stream API
- 新新增的Stream API(java.util.stream) 把真正的函數語言程式設計風格引入到Java中。
- Date Time API
- 加強對日期與時間的處理。
- Optional 類
- Optional 類已經成為 Java 8 類庫的一部分,用來解決空指標異常。
一、Lambda表示式
使用示例:
/**
*interface MathOperation {
* int operation(int a, int b);
*}
**/
// 1. 不需要引數,返回值為 5
() -> 5
// 2. 接收一個引數(數字型別),返回其2倍的值
x -> 2 * x
// 3. 接受2個引數(數字),並返回他們的差值
(x, y) -> x – y
// 4. 接收2個int型整數,返回他們的和
(int x, int y) -> x + y
// 5. 接受一個 string 物件,並在控制檯列印,不返回任何值(看起來像是返回void)
(String s) -> System.out.print(s)
// 型別宣告,表示式主題內只有一條語句可以不用大括號{}
MathOperation addition = (int a, int b) -> a + b;
// 不用型別宣告
MathOperation subtraction = (a, b) -> a - b;
// 大括號中的返回語句,大括號需要指定明表示式返回
MathOperation multiplication = (int a, int b) -> { return a * b; };
// 沒有大括號及返回語句,會自動返回值
MathOperation division = (int a, int b) -> a / b;
以下是lambda表示式的重要特徵:
- 可選型別宣告:不需要宣告引數型別,編譯器可以統一識別引數值。
- 可選的引數圓括號:一個引數無需定義圓括號,但多個引數需要定義圓括號。
- 可選的大括號:如果主體包含了一個語句,就不需要使用大括號。
- 可選的返回關鍵字:如果主體只有一個表示式返回值則編譯器會自動返回值,大括號需要指定明表示式返回了一個數值。
注意:
在 Lambda 表示式當中不允許宣告一個與區域性變數同名的引數或者區域性變數。
String first = "";
Comparator<String> comparator = (first, second) -> Integer.compare(first.length(), second.length()); //編譯會出錯
二、與集合forEach方法聯用
public class Java8Tester {
public static void main(String args[]){
List names = new ArrayList();
names.add("Google");
names.add("Runoob");
names.add("Taobao");
names.add("Baidu");
names.add("Sina");
names.forEach((anyThing)->System.out.println(anyThing));
}
}
返回結果
Runoob
Taobao
Baidu
Sina
原理:
forEach() 方法是Iterable介面中的一個方法。Java集合中,所有的Collection子類(List、Set)會實現Iteratable介面以實現foreach方法
public interface Iterable<T> {
Iterator<T> iterator();
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
}
方法裡面有個Consumer型別,它是Java8新增的一個消費型函式式介面,其中的accept(T t)方法代表了接受一個輸入引數並且無返回的操作。
@FunctionalInterface
public interface Consumer<T> {
/* 接收單個引數,返回為空 */
void accept(T t);
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
}
回到最外層的程式碼
names.forEach((anyThing)->System.out.println(anyThing));
顯然,forEach括號內的Lambda表示式即實現accept方法構建了一個Consumer匿名物件,而jdk幫我們做的就是for迴圈每拿到一個元素,作為accept的引數傳入Consumer物件內供每次呼叫!
三、總結:
Lambda 表示式主要用來定義行內執行的方法型別介面(通過代表實現方法主體以替代匿名內部類),例如,一個簡單方法介面。在上面例子中,我們使用各種型別的Lambda表示式來定義MathOperation介面的方法。然後我們定義了operation方法的執行主體。
相關文章
- Python學習筆記 - lambda表示式Python筆記
- JDK1.8 Lambda 表示式的學習JDK
- 工作學習筆記(十一)Lambda 表示式筆記
- JDK1.8新特性--Lambda表示式JDK
- jdk1.8新特性:Lambda表示式JDK
- 深圳Java培訓學習:Java8.0新特性之Lambda表示式Java
- JDK1.8新特性之Lambda表示式JDK
- JDK1.8新特性之Lambda表示式()->JDK
- JDK1.8的新特性之Lambda表示式JDK
- Java 8新特性(一):Lambda表示式Java
- java8學習:lambda表示式(2)Java
- java8學習:lambda表示式(1)Java
- jdk1.8 新特性之 如何寫lambda表示式JDK
- Java8新特性(一)-Lambda表示式Java
- Java筆記:Lambda表示式Java筆記
- JavaScript正規表示式學習筆記(一)JavaScript筆記
- 最近學習到的Lambda表示式
- 正規表示式學習筆記筆記
- Java8新特性(1):Lambda表示式Java
- java-反射,介面新特性,Lambda表示式Java反射
- java8 新特性之Lambda 表示式Java
- JDK1.8新特性:Lambda表示式語法和內建函式式介面JDK函式
- JDK8 新特性學習筆記JDK筆記
- jdk-1.8新特性學習筆記JDK筆記
- Python學習筆記 - 正規表示式Python筆記
- 學習筆記~1.4 HTML5新特性筆記HTML
- Javascript學習筆記——4.11 賦值表示式JavaScript筆記賦值
- java8特性-lambda表示式Java
- 禿頭星人進化記(Lambda表示式學習總結)
- 《JAVA學習指南》學習筆記Java筆記
- 正規表示式學習(2)---字元特性字元
- 尹成學院golang學習快速筆記(2)表示式Golang筆記
- JDK 1.8 新特性之Lambda表示式JDK
- .NET3.5新特性,Lambda表示式
- JDK1.8 之Lambda表示式JDK
- JDK1.8之lambda表示式JDK
- Java1.8新特性學習Java
- C#特性學習筆記C#筆記