Lambda 表达式在不少编程语言中都有 , 个人理解就是jdk1.8z中能够将函数做为参数传递了 , 并将代码简化了java
以排序为例 编程
在老版本中是这样写的 : 编程语言
Integer[] array = new Integer[] {1,3,2} ; Arrays.sort(array,new Comparator<Integer>() { public int compare(Integer a, Integer b) { return a-b; } }); System.out.println("升序排序 : "+Arrays.toString(array));
输出内容以下 :ide
升序排序 : [1, 2, 3]函数
是用 Lambda 表达式是这样写的测试
Integer[] array = new Integer[] {1,3,2} ; Arrays.sort(array, (a,b)-> b-a); System.out.println("降序排序 : "+Arrays.toString(array));
输出内容以下 : spa
降序排序 : [3, 2, 1]code
Arrays.sort 这一句被大大简化了
下面是我用本身的方法来一步步简化演示 :对象
首先定义一个函数式接口 (即 : 这个接口中只有一个函数)blog
/** * 函数式接口 : 仅含有一个方法的接口 */ public interface ISay { public String say(String msg) ; }
而后定义一个方法来调用这个接口对象
(由于接口和接口中的方法一对一 , 咱们能够理解成把这个方法做为参数传递)
public static String doSay(String user,String msg ,ISay say) { return user + " : " + say.say(msg); };
传统的调用方式是这样的
String str = doSay("老大","早上好!",new ISay(){ @Override public String say(String msg) { return "【"+msg+"】" ; } });
输出内容以下 :
老大 : 【早上好!】
下面是有 lambda 表达式简化
String str1 = doSay("张三","你好!",(ISay)(String msg)->{ return "【"+msg+"】" ; }); System.out.println(str1);
输出内容以下 :
张三 : 【你好!】
将接口中的方法头简化掉了 , (接口中只有一个方法,不用说也知道方法体对应的哪个方法)
将参数 (String msg) 保留着 , 由于方法体要调用参数
将 new 关键字也简化掉了 , 接口又没有带参数的构造函数
进一步简化以下 :
String str2 = doSay("李四","你好!",(msg)->{ return "【"+msg+"】" ; }); System.out.println(str2);
输出结果以下 :
李四 : 【你好!】
将参数类型简化掉了
将强转类型 (ISay) 简化掉了 , doSay 函数的第三个参数就是 ISay 类型 , 不用再强转说明
继续简化
String str3 = doSay("王五","你也好!",(msg)->"【"+msg+"】");
System.out.println(str3);
输出结果以下 :
王五 : 【你也好!】
将方法体的大括号简化掉了
将 return 关键字简化掉了
最终简化
String str4 = doSay("赵六","你也好啊!",msg->"【"+msg+"】");
System.out.println(str4);
输出结果以下 :
赵六 : 【你也好啊!】
将 msg 外面的小括号简化掉了
因此说 lambda 就是一个不断将代码简化的过程 ;
口诀:左右遇一省括号,左侧推断类型省
完整代码以下 ISay.java 和 Main.java
接口类 ISay.java :
/** * 函数式接口 : 仅含有一个方法的接口 */ public interface ISay { public String say(String msg) ; }
测试类 Main.java :
import java.util.Arrays; import java.util.Comparator; public class Main { public static void main(String[] args) { Integer[] array = new Integer[] {1,3,2} ; Arrays.sort(array,new Comparator<Integer>() { public int compare(Integer a, Integer b) { return a-b; } }); System.out.println("升序排序 : "+Arrays.toString(array)); String str = doSay("老大","早上好!",new ISay(){ @Override public String say(String msg) { return "【"+msg+"】" ; } }); System.out.println(str); //------------------ Lambda 表达式 -------------------// Arrays.sort(array, (a,b)-> b-a); System.out.println("降序排序 : "+Arrays.toString(array)); String str1 = doSay("张三","你好!",(ISay)(String msg)->{ return "【"+msg+"】" ; }); System.out.println(str1); System.out.println("-------------------------------------------"); String str2 = doSay("李四","你好!",(msg)->{ return "【"+msg+"】" ; }); System.out.println(str2); System.out.println("-------------------------------------------"); String str3 = doSay("王五","你也好!",(msg)->"【"+msg+"】"); System.out.println(str3); System.out.println("-------------------------------------------"); String str4 = doSay("赵六","你也好啊!",msg->"【"+msg+"】"); System.out.println(str4); System.out.println("end/:-)"); } public static String doSay(String user,String msg ,ISay say) { return user + " : " + say.say(msg); }; }