Lambda是Java 8引入的新特性,在Java語法層面,Lambda表達式允許函數(shù)作為一個方法的參數(shù)(函數(shù)作為參數(shù)傳遞到方法中);在具體實現(xiàn)上主要依靠了JVM底層提供的 Lambda相關API (現(xiàn)有語法的封裝 )
注:部分代碼示例和說明是轉(zhuǎn)載使用
Lambda表達式
- 語法:
(參數(shù)列表)箭頭操作符 Lambda體
( (int) arg1, (String) arg2) -> {..}- 參數(shù)類型可選; int, String 可省
- 參數(shù)列表只含有一個參數(shù)可省略( );
- Lambda體如果只含有一個語句,則可省略{ },類似于實現(xiàn)了函數(shù)式接口中的方法。
注:Lambda表達式可簡化函數(shù)式接口的使用,常與內(nèi)部類對比使用,函數(shù)式接口即有且僅有一個抽象方法的接口;函數(shù)式接口可以顯示地被@FunctionallInterface 所表示。
- Application:簡化接口使用
public class TestLambda {
public static void main(String[ ] args) {
// regular invocation
ICar car1 =new ICarImpl();
car1.drive();
// Anonymous class
ICar car2 =new ICar() { public void drive() { System.out.println("Drive BenzX3"); }
car2.drive();
// Lambda
ICar car3 = ( )-> System.out.println("Drive BenzQ7");
car3.drive();
IDriver car4 =(who)->{ System.out.println(who+" is driving");};
car4.drive("Eli");
ICleaner car5 = (fare, month) -> fare*month; // (fare,month)->{return fare*month};
System.out.println("Benz cleaning costs: "+car5.wash(3.8,5));
}
}
interface ICa { void drive( ); }
interface IDriver { void drive ( String driver ); }
interface ICleaner { double wash ( final double fare, int month ); }
class ICarImpl implements ICar{
public void drive( ) {
System.out.println("Drive Benz");
}
}
- 3 Application:
public static void main(String[] args) {
ArrayList arr =new ArrayList( );
arr.add("Eli");
arr.add("Josh");
arr.add("Mike");
arr.forEach( n -> System.out.println(n) );
}
方法引用 --- 更簡約的Lambda表達式
- 方法引用是Java 8 引入的新特性,可以直接引用已有的Java類或?qū)ο?/em>的方法或構(gòu)造器,相比于Lambda表達式,可以簡化代碼。
- Lambda表達式可被方法引用代替:Lambda表達式的主體僅包含一個表達式,且該表達式僅調(diào)用了一個已經(jīng)存在的方法。方法引用的通用特性:方法引用中所使用方法的參數(shù)列表和返回值與lambda表達式實現(xiàn)的函數(shù)式接口的參數(shù)列表和返回值一致。
public static void main(String[] args) {
ArrayList arr =new ArrayList();
arr.add("Eli");
arr.add("Josh");
arr.add("Mike");
// arr.forEach(n-> System.out.println(n));
arr.forEach(System.out::println);
// 若arr.forEach( n -> System.out.println(n+1) ); 則不能使用方法引用替換
}
方法引用類型:
注:Function,Consumer,Predicate,Supplier等為Java 8 內(nèi)置的函數(shù)式接口
類型1:方法引用
Class name :: Static Method
Class name :: Instance Method
Instance object :: Instance Method
/**
* 類名::靜態(tài)方法
*/
// Comparator com = (x,y)-> Integer.compare(x,y);
Comparator com = Integer::compare;
/**
* 類名:: 實例方法
*/
// Predicate bp = (x,y) -> x.equals(y);
Predicate bp = String::equals;
/**
* 對象:: 實例方法
*/
// Consumer con = x-> System.out.println(x);
PrintStream out = System.out;
Consumer con = out::println;
類型2:構(gòu)造器引用
Class name :: new
Class name[ ] :: new
/**
* 類:: new
*/
//Supplier supplier = () -> new String();
Supplier supplier = String::new;
類型3:數(shù)組引用
Type :: new
/**
* 數(shù)組類型:: new
*/
//Function fun = x -> new String[x];
Function fun = String[]::new;