zoukankan      html  css  js  c++  java
  • 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);
        };
    
    }
  • 相关阅读:
    赔了多少钱
    datatables使用
    Django开发汇总
    STF的DOCKER搭建
    ubuntu基本
    python 列表、元组、字典、字符串
    Appium环境搭建
    AppCrawler环境搭建
    TASK 总结
    python & jira
  • 原文地址:https://www.cnblogs.com/hi-gdl/p/10913621.html
Copyright © 2011-2022 走看看