一、概述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.一、匿名内部类