Java 8 Lambda表達式

#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中能夠爲接口添加靜態方法。

相關文章
相關標籤/搜索