Java Lambda表達式詳解

– 面向過程程序語言:參數傳遞是基本類型的變量
– 面嚮對象語言:

  • 傳遞基本類型的變量
  • 傳遞對象變量

– 函數式程序語言設計:傳遞方法 / 代碼塊
即允許把函數作爲一個方法的參數(函數作爲參數傳遞進方法中)–>> Lambda 表達式–> Java 8 發佈的新特性,引入了一個新的操作符 " -> " 該操作符稱爲箭頭操作符或 Lambda 操作符

使用 Lambda 表達式可以使代碼變的更加簡潔緊湊。

lambda 表達式的語法格式:
  • 參數,箭頭,一個表達式
(parameters) -> expression
  • 參數,箭頭,{多個語句}
(parameters) ->{ statements; }
lambda表達式的重要特徵:
  • 類似匿名方法,一個沒有名字的方法
  • 不需要聲明參數類型,編譯器可以統一識別參數值
  • 堅決不聲明返回值類型
  • 沒有 public/protected/private/static/final 等修飾符
  • 單句表達式,將直接返回值,不用大括號
  • 帶 return 語句, 算多句,必須用大括號(不用void()聲明)
    如果有返回值,返回值類型會在上下文推斷出來的,無需聲明,只在某幾個分支有返回值,是不合法的
x ->
{
	if(x>0)
		return x+1;
};
數組字符串排序實例
package com.lambda;

import java.util.Arrays;
//doc:StringOrderTest.java
public class StringOrderTest {

	public static void main(String[] args) {
		String[] planets = new String[] { 
				"Mercury", "Venus", "Earth", "Mars", 
				"Jupiter", "Saturn", "Uranus","Neptune" };	

		System.out.println(Arrays.toString(planets));		//返回指定數組的內容的字符串表示形式
		System.out.println("=======================");
		System.out.println("使用長度從小到大的比較器:");
		Arrays.sort(planets, new LengthAscComparator());	//按照數字順序排列指定的數組
		
		System.out.println(Arrays.toString(planets));
		System.out.println("使用長度從大到小的比較器:");
		Arrays.sort(planets, new LengthDescComparator());
		System.out.println(Arrays.toString(planets));		

		System.out.println("=======================");
		System.out.println("使用Lambda, 長度從小到大:");
		Arrays.sort(planets, 
				(String first, String second) 
				   -> first.length() - second.length());
		System.out.println(Arrays.toString(planets));
		
		System.out.println("使用Lambda, 長度從大到小:");
		Arrays.sort(planets, (first, second) -> (-1) * (first.length() - second.length()));
		System.out.println(Arrays.toString(planets));
		
		System.out.println("使用Lambda, 長度從大到小:");
		Arrays.sort(planets, 
			(String first, String second) -> {
				int result = (-1) * (first.length() - second.length());
				return result;
			}
		);
		System.out.println(Arrays.toString(planets));
		
		System.out.println("=======================");
		//無參數,僅保留括號,箭頭和表達式
		new Thread(
			() -> {
				int sum = 0;
				for (int i = 1; i <= 100; i++) {
					sum = sum + i;
				}
				System.out.println("總和:" + sum);
			}
		).start();

	}
}
package com.lambda;

import java.util.Comparator;		//比較器,Comparator接口實現自定義排序
//doc:LengthAscComparator.java
public class LengthAscComparator implements Comparator<String> {
	public int compare(String first, String second) {
		//獲取2個字符串長度
		int len1 = (first==null? 0 : first.length());
		int len2 = (first==null? 0 : second.length());
		
		//如果len1 == len2,返回0,表示兩個字符串相等
		//如果len1 >  len2,返回正數,表示first>second
		//如果len1 <  len2,返回負數,表示first<second
		return len1 - len2;
	}
}
package com.lambda;

import java.util.Comparator;
//doc:LengthDescComparator.java
public class LengthDescComparator implements Comparator<String> {
	public int compare(String first, String second) {
		//獲取2個字符串長度
		int len1 = (first==null? 0 : first.length());
		int len2 = (first==null? 0 : second.length());
		
		//如果len1 == len2,返回0,表示兩個字符串相等
		//如果len1 >  len2,返回正數,表示first>second
		//如果len1 <  len2,返回負數,表示first<second
		return (-1) * (len1 - len2);
	}
}

運行結果:
在這裏插入圖片描述

函數式接口 (Functional Interface)
  • 只包含一個抽象方法的接口
  • 可以包括其他的 default 方法、 static 方法、 private 方法
  • 由於只有一個未實現的方法,所以 Lambda 表達式可以自動填上這個尚未實現的方法
  • 採用 Lambda 表達式,可以自動創建出一個( ( 僞) ) 嵌套類的對象( ( 沒有實際的嵌套類 class 文件產生) ),然後使用,比真正嵌套類 更加輕量 ,更加簡潔高效

上例中 - - >> Lambda 表達式( ( 匿名函數) ) 自動成爲接口方法的實現
Lambda 表達式:自動填充上Comparator的compare方法,變成一個Comparator的子對象
在這裏插入圖片描述
若不用Lambda 表達式,可採用匿名內部類:相對不夠簡潔,還會產生額外的嵌套類的class文件(含$符號的文件)
在這裏插入圖片描述

java.utils包下的Comparator接口。該接口代表一個比較器,java數組工具類和集合工具類中提供對sort方法排序就是使用 Comparator接口來處理排序的。
Comparator接口中有一個方法int compare(T o1, T o2)。這個方法返回值是int類型,
如果返回值小於0,說明比較結果是o1<o2,
如果返回值等於0,說明比較結果是o1=o2,
如果返回值大於0,則說明比較結果是o1>o2。

自定義函數式接口時,可寫上系統自帶的函數式接口註解,用於編譯器檢查:

@FunctionalInterface
函數式接口的優缺點:
  • 只帶有一個未實現的方法,內容簡單
  • 大量重複性的函數式接口,使得源碼膨脹

爲避免源碼膨脹,可採用系統自帶的函數式接口

  • 涵蓋大部分常用的功能,可以重複使用
  • 位於 java.util.function 包中
Java內置的四大函數式接口:

在這裏插入圖片描述

方法引用: Method Reference

Lambda 表達式支持傳遞現有的類庫函數
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章