一、概述java
1.一、Lambda表達式 容許 使用 簡潔的代碼 建立 只有一個抽象方法的接口 的實例;ide
@FunctionalInterface public interface Command { void process(int[] array); }
public class ProcessArray { public void process(Object target,Command command){ } }
public class LambdaTest { public static void main(String[] args) { ProcessArray processArray=new ProcessArray(); int[] array=new int[]{1,2,1,1,1,1}; /** * before Lambda */ processArray.process(new Object(), new Command() { @Override public void process(int[] intArray) { //do something... } }); /** * after Lambda 參數帶類型 */ processArray.process(new Object(),(int[] intArray)->{ //do something... }); /** * after Lambda 參數不帶類型 */ processArray.process(new Object(),(intArray)->{ //do something... }); } }
1.二、函數式接口函數
1.2.一、 Lambda表達式的 目標類型 必須是 函數式接口;spa
1.2.二、 函數式接口: 3d
只包含一個抽象方法的接口;code
可包含多個 默認方法、類方法;對象
1.三、方法引用、構造器引用blog
1.3.一、類方法引用接口
@FunctionalInterface public interface Converter { Integer converter(String src); }
public class Test { public static void main(String[] args) { //Lambda表達式建立對象 Converter converter=src -> Integer.valueOf(src); System.out.println(converter.converter("12")); /** * 類方法引用 * 調用Integer的valueOf() 實現 Converter接口中的惟一抽象方法converter(); * 當調用Converter接口的converter()時,參數 將會 傳給 Integer的valueOf(); */ Converter converter1=Integer::valueOf; System.out.println(converter1.converter("122")); } }
1.3.二、對象方法引用get
@FunctionalInterface public interface Converter { Integer converter(String src); }
//Lambda表達式建立對象 Converter converter2=src -> "kit.org".indexOf(src); System.out.println(converter2.converter("it")); /** * 對象方法引用 * "kit.org"對象的indexOf() 實現 Converter接口中的惟一抽象方法converter(); * 當調用Converter接口的converter()時,參數 將會 傳給 "kit.org"對象的indexOf(); */ Converter converter3="kit.org"::indexOf; System.out.println(converter3.converter("it"));
1.3.三、類對象的實例方法引用
@FunctionalInterface public interface MySub { String sub(String a,int b,int c); }
public class Test { public static void main(String[] args) { //Lambda表達式建立對象 MySub mySub=(a,b,c)->a.substring(b,c); System.out.println(mySub.sub("hello",1,2)); /** * 類對象的實例方法引用 * String的substring() 做爲 MySub接口的sub()的實現; * 當MySub實例調用sub()時,a參數 做爲 String的substring()的調用者; * b,c參數 做爲 a實例的substring()的參數; */ MySub mySub1=String::substring; System.out.println(mySub1.sub("hello",0,2)); } }
1.3.四、構造器 引用
@FunctionalInterface public interface WinTest { JFrame win(String s); }
public class Test { public static void main(String[] args) { //Lambda表達式建立對象 WinTest winTest=s -> new JFrame(s); System.out.println(winTest.win("hello")); /** * 構造器引用 * JFrame的JFrame(String title)構造器 做爲 WinTest的win()的實現; * 當使用WinTest實例的win()時,參數將傳遞給 JFrame的JFrame(String title)構造器; */ WinTest winTest1=JFrame::new; System.out.println(winTest1.win("hello111")); } }
二、應用
2.一、匿名內部類