jdk8新特性之方法引用


方法引用

1、什么時候用方法引用

當要傳遞給Lambda體的操作,已經有實現的方法了,可以使用方法引用。

2、方法引用是什么

方法引用可以看做是Lambda表達式深層次的表達。換句話說,方法引用就

是Lambda表達式,也就是函數式接口的一個實例,通過方法的名字來指向

一個方法,可以認為是Lambda表達式的一個語法糖。

3、方法引用的要求

實現接口的抽象方法的參數列表和返回值類型,必須與方法引用的 方法的參數列表和返回值類型保持一致!(方法名可以不同)

4、方法引用的格式

使用操作符 “::” 將類(或對象) 與 方法名分隔開來。

1.常規方法引用

如下三種主要使用情況:

  1. 對象實例::方法名
  2. 類靜態::方法名
  3. 類實例::方法名

2.特殊的方法引用

1.構造器引用

格式: ClassName::new

與函數式接口相結合,自動與函數式接口中方法兼容。 可以把構造器引用賦值給定義的方法,要求構造器參數列表要與接口中抽象 方法的參數列表一致!且方法的返回值即為構造器對應類的對象。

2.數組引用

格式: type[] :: new

5、方法引用的實例

// 情況一:對象 :: 實例方法
	//Consumer中的void accept(T t)
	//PrintStream中的void println(T t)
	@Test
	public void test1() {
		Consumer<String> con1 = s-> System.out.println(s);
		con1.accept("北京");
		PrintStream ps = new PrintStream(System.out);
		Consumer<String> con2 = ps::println;
		con2.accept("南京");
	}
/ 情況二:類 :: 靜態方法
	//Comparator中的int compare(T t1,T t2)
	//Integer中的int compare(T t1,T t2)
	@Test
	public void test3() {
		Comparator<Integer> c1 = (o1,o2)-> Integer.compare(o1,o2);
		System.out.println(c1.compare(12, 23));
		Comparator<Integer> c2 = Integer::compareTo;
		System.out.println(c2.compare(12, 12));
	}

當涉及到的兩個參數,一個是另一個的調用者的時候,可用情況三。

// 情況三:類 :: 實例方法 
	// Comparator中的int comapre(T t1,T t2)
	// String中的int t1.compareTo(t2)	t1作為調用者出現
	@Test
	public void test5() {
		Comparator<String> c1 = (s1,s2)->s1.compareTo(s2);
		System.out.println(c1.compare("abc", "abd"));
		Comparator<String> c2 = String::compareTo;
		System.out.println(c2.compare("abc", "abm"));
	}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM