#Lambda表達式數組
##1.Lambda表達式 Lambda表達式是一段能夠傳遞的代碼,所以他能夠執行一次或者屢次。閉包
String array[]={"Harry", "Potter", "Jack", "Tom"}; List<String> list=Arrays.asList(array); //使用lambda遍歷 list.forEach((String) -> System.out.print(String+";")); //使用匿名類 new Thread(new Runnable() { @Override public void run() { System.out.println("this is NimingThread!"); } }).start();; //將匿名類轉換爲lambda表達式 new Thread(()->System.out.println("this is lambda")).start();
輸出爲:Harry;Potter;Jack;Tom; this is NimingThread! this is lambda ##2.函數式接口 對於只包含一個抽象方法的接口,能夠經過lamba表達式來建立接口的對象,這種接口被稱爲函數式接口。ide
//使用lambda對數組排序 //方式一 Arrays.sort(array, (String s1, String s2) -> (s1.compareTo(s2))); //方式二 Comparator<String> sort = (String s1, String s2) -> (s1.compareTo(s2)); Arrays.sort(array, sort);
##3.方法引用 有些時候,想要傳遞給其餘代碼的操做已經有實現的方法了。如按鈕點擊打印對象,以下函數
//方式一 button.setAction(event->System.out.println(event)); //方式二: button.setOnAction(System.out::println);
::操做符講方法名和對象或類的名字分隔開來。以下三種狀況:this
對象::實例方法code
類::靜態方法對象
類::實例方法排序
還能夠捕獲方法引用中的super對象接口
static class Test{ public void test(){ System.out.println("test!!"); } } static class TestImpl extends Test{ @Override public void test() { new Thread(()->super.test()).start(); } }
輸出爲:test!! ##4.構造器引用 構造器引用同方法引用相似,不一樣的是構造器引用中方法名是new。 例如Test::new 表達Test類的構造器引用。 ##5.變量做用域 一般,咱們但願能在lambda表達式的閉合方法或其餘類中訪問其餘的變量作用域
static void sendMessage(String word,int count){ new Thread(()->{for(int i=0;i<count;i++){ System.out.print(word+"; "); }}).start(); } //main程序調用 sendMessage("hello world", 5);
輸出爲:hello world; hello world; hello world; hello world; hello world; 在lambda表達式中並無定義word,count,使用的是sendMessage的參數變量。緣由爲一個lambda包含三個部分
一段代碼
參數
自由變量的值,「自由」指的是否是參數,而且沒有被定義的變量。
因此,此例中lambda有兩個自由變量,word和count。 notes:含有自由變量的代碼塊稱爲閉包。 ##6.默認方法 Java經過默認方法容許接口包含帶有具體實現的方法。
public interface Animal { public void sleep(); default public void run(){ System.out.println("I am Running"); }; }
若是一個接口中定義了一個默認方法,而另一個父類或接口又定義了一個同名的方法,解決方法遵循以下規則:
選擇父類中的方法。若是一個父類提供了具體的實現,那麼接口中具體相同名稱和參數的默認方法就會被忽略。
接口衝突。若是一個父接口提供了一個默認方法,而另外一個接口特提供了一個具備相同名稱和參數的默認方法,那麼必須經過在具體類裏覆蓋方法來解決衝突。
public class Animal { public void run(){ System.out.println("Animal is running"); } } public interface Activity { public void sleep(); default public void run(){ System.out.println("Activity is Running"); }; } public class Tiger extends Animal implements Activity{ @Override public void sleep() { // TODO Auto-generated method stub System.out.println("Tiger is Sleeping"); } //發生衝突時,重寫run方法。 // @Override // public void run(){ // System.out.println("Tiger is running"); // } }
輸出爲:Animal is running ##7.接口中的靜態方法 在Java 8中能夠爲接口添加靜態方法。