Java——Lambda表達式

Lambda表達式是Java8的重要更新。         Lambda表達式容許使用更簡潔的代碼來建立只有一個抽象方法的接口(之中接口被稱爲函數式接口)的實例。java

如可將數組

pa.process(target,new Command(){            //匿名內部類
    public void process(int []target){
        int sum=0;
        for(int tmp:target){
            sum+=tmp;
        }
        System.out.println("數組元素的總和是:"+sum);
    }
});

改寫爲函數

pa.process(target,(int []target)->{            //lambda表達式
        int sum=0;
        for(int tmp:target){
            sum+=tmp;
        }
        System.out.println("數組元素的總和是:"+sum);
});

比較可知,lambda表示省略了要被繼承的父類名,或要實現的接口名,直接給出要重寫的方法的形參列表,連函數名也都省略,只保留函數內部的語句。也不須要給出要被重寫的函數的返回值類型。spa

lambda表達式實際上會被當成一個「任意類型」的對象。到底須要當成何種類型的對象,取決於運行環境的須要。code

 

Lambda表達式與函數式接口:對象

函數式接口表明只包含一個抽象方法的接口。繼承

lambda表達式有兩個限制:①目標類型必須是明確的函數式接口。②只能爲函數式接口建立對象。接口

get

Object obj=()->{};//方法會報錯,由於目標obj不是函數式接口

Object obj=(Runnable)()->{};//成功運行,對lambda表達式進行強制類型轉換,Runnable是函數式接口

爲了保證lambda表達式的目標類型是一個明確的函數式接口,有以下三種常見方式:string

①將lambda表達式賦值給函數式接口類型的變量。

②將lambda表達式做爲函數式接口類型的參數傳給某法方法。

使用函數式接口都lambda表達式進行強制類型轉換

 

方法引用和構造器引用:

1.引用類方法:

Converter converter1=Integer::valueOf;

2.引用特定對象的實例方法

Converter converter2="fkit.org"::indexOf;

3.引用某類對象的實例方法

MyTest mt=(a,b,c)->a.substring(b,c);    //原

MyTest mt=String::substring;            //新

4.引用構造器

YourTest yt=(String a)->new JFranme(a); //原

YourTest yt=JFranme::new;               //新

 

lambda表達式和匿名內部類的聯繫和區別:

相同點:

①均可以直接訪問「effectively final」的局部變量,以及外部類的成員變量。

②二者建立的對象,均可以直接調用接口中繼承的默認方法

 

不一樣點:

①匿名內部類能夠生成全部的抽象方法,可是lambda表達式只能爲函數式接口(只有一個抽象方法)建立實例。

②匿名內部類能夠爲抽象量、普通類建立實例;可是lambda表達式只能爲函數式接口。

③匿名內部類實現的抽象方法的內部容許調用接口中定義的默認方法;可是lambda表達式的代碼塊中不容許調用接口中定義的默認方法。

 

使用lambda表達式調用Arrays的類方法:

Arrays類的有些方法須要Comparator、xxxOperator。xxxFunction等接口的實例,這些接口都是函數式接口,所以能夠使用lambda表達式來調用Arrays的方法。

相關文章
相關標籤/搜索