[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方法的執行主體。
相關文章
- Java Lambda 表示式學習筆記Java筆記
- JDK1.8 Lambda 表示式的學習JDK
- Python學習筆記 - lambda表示式Python筆記
- 工作學習筆記(十一)Lambda 表示式筆記
- 深圳Java培訓學習:Java8.0新特性之Lambda表示式Java
- JDK1.8新特性--Lambda表示式JDK
- jdk1.8新特性:Lambda表示式JDK
- C++11 學習筆記 lambda表示式筆記
- Java 8新特性學習之一:Java 8 lambda表示式初步第一回Java
- JDK1.8新特性之Lambda表示式JDK
- JDK1.8新特性之Lambda表示式()->JDK
- jdk1.8 新特性之 lambda表示式JDK
- Java 8新特性學習之一:Java 8 lambda表示式初步第六回Java
- JDK1.8的新特性之Lambda表示式JDK
- Java 8新特性(一):Lambda表示式Java
- java 8新特性學習之五:Java 8 lambda表示式初步第五回Java
- java 8新特性學習之四:Java 8 lambda表示式初步第四回Java
- java 8新特性學習之三:Java 8 lambda表示式初步第三回Java
- java8學習:lambda表示式(2)Java
- java8學習:lambda表示式(1)Java
- jdk1.8 新特性之 如何寫lambda表示式JDK
- java 8新特性學習之二:Java 8 lambda表示式初步第二回Java
- Java8新特性(一)-Lambda表示式Java
- Java 8 Lambda 表示式學習心得總結Java
- 正規表示式學習筆記一筆記
- java8新特性之lambda表示式(一)Java
- JavaScript正規表示式學習筆記(一)JavaScript筆記
- 最近學習到的Lambda表示式
- Java筆記:Lambda表示式Java筆記
- 正規表示式學習筆記筆記
- angular學習筆記(十一)-表示式Angular筆記
- Java8新特性(1):Lambda表示式Java
- java8 新特性之Lambda 表示式Java
- java-反射,介面新特性,Lambda表示式Java反射
- Java8 新特性之 Lambda 表示式Java
- JDK1.8最新特性--Lambda表示式(重點)JDK
- jdk-1.8新特性學習筆記JDK筆記
- JDK8 新特性學習筆記JDK筆記