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);
    };

}
原文地址:https://www.cnblogs.com/hi-gdl/p/10913621.html