jdk1.8 中的 Lambda 表达式学习
Lambda 表达式在很多编程语言中都有 , 我的理解就是jdk1.8z中可以将函数作为参数传递了 , 并将代码简化了
以排序为例
在老版本中是这样写的 :
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));
输出内容如下 :
升序排序 : [1, 2, 3]
是用 Lambda 表达式是这样写的
Integer[] array = new Integer[] {1,3,2} ; Arrays.sort(array, (a,b)-> b-a); System.out.println("降序排序 : "+Arrays.toString(array));
输出内容如下 :
降序排序 : [3, 2, 1]
Arrays.sort 这一句被大大简化了
下面是我用自己的方法来一步步简化演示 :
首先定义一个函数式接口 (即 : 这个接口中只有一个函数)
/** * 函数式接口 : 仅含有一个方法的接口 */ 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); }; }