• 抛开其它看技术本身之lambda


    前言

    • 如果你在别的教材上学习lambda感觉云里雾里,我相信,我这篇文章一定能为你解开心中所有疑惑。
    • 作者信息:网梦 QQ : 2756978088

    lambda定义

    • lambda是应用在只有一个抽象方法的接口上一种表达式,其目的是为了简化匿名内部类。(关键词:只有一个抽象方法,针对接口)

    先来看匿名内部类

    • 为了弄明白lambda表达式,先要明白什么是匿名内部类
    • 先定义一个接口 Message ,接口内有两个抽象方法 print()fun()
    interface Message {
        void print() ;
        void fun() ;
    }
    
    • 按照最初的方式,我们要使用这个接口,就必须要有一个类实现了这个接口,如下:
    class MessageImpl implements Message {
        public void print() {
        System.out.println("Hello World !") ;
        }
        public void fun() {
        System.out.println("fun method") ;
        }
    }
    
    • 在主方法中使用时,代码如下:
    public class Hello {
        public static void main(String[] args) {
            Message msg = new MessageImpl() ;
            msg.print() ;
            msg.fun() ;
       }
    }
    
    • 好了,现在来看匿名内部类上面为了使用接口里的方法,而特意建了一个类 MessageImpl ,这个类也没有扩充新方法,所以感觉有些多余,这时候就可以用匿名内部类来解决这个多余类的问题,代码如下:
    public class Hello {
        public static void main(String[] args) {
            // 删除 多余的MessageImpl 类,直接使用匿名内部类
            Message msg = new Message() {
                public void print() {
                    System.out.println("Hello World !") ;
                }
                public void fun() {
                    System.out.println("fun method") ;
                }
            } ;
            msg.print() ;
            msg.fun() ;
       }
    }
    
    • 以上代码省略了实现接口的类,直接在实例化时加了一个代码块,代码块里面覆写了接口中所有的抽象方法(可以是一个,也可以是多个)

    回到lambda,简化匿名内部类

    • 内部类看起来实在是繁琐,为了使代码更elegance,lambda应运而生。lambda定义了,当接口中有且仅有一个抽象方法时,可以将匿名内部部的写法简化。
    • 先假设Message接口中只有一个print抽象方法
    interface Message {
        void print() ;
    }
    
    • 基于以上匿名内部类的讲解使用时是如下情况:
    public class Hello {
        public static void main(String[] args) {
            Message msg = new Message() {
                public void print() {
                    System.out.println("Hello World !") ;
                }
            } ;
            msg.print() ;
       }
    }
    
    • 将匿名内部类部分代码拿出来,重点观察
    Message msg = new Message() {
        public void print() {
            System.out.println("Hello World !") ;
        }
    } ;
    
    • 用lambda表达式书写格式一:
    Message msg = () -> {System.out.println("Hello World !")} ;
    
    • 用lambda表达式书写格式二:
    Message msg = () -> System.out.println("Hello World !") ;
    

    lambda 概念总结

    • 前提条件:lambda表达式 是针对只有一个抽像方法的接口。
    • 语法格式如下两种(一种有大括号{},一种没有大括号)
    (参数) -> 表达式
    (参数) -> {代码行;}
    
    • 参数:因为lambda针对的接口中只有一个抽象方法,所以这里的 (参数) 就对应这个抽象方法的参数。
    • (参数) -> 表达式 :如果覆写方法的代码只有一行代码的话,那就可以省略掉大括号{}而直接书写单行表达式即可。
    • (参数) -> 表达式 :如果覆写方法的代码只有一行代码 并且 有返回值时,不仅可以省略大括号,还可以省略return关键字。
    • (参数) -> {代码行;} :如果覆写方法的代码有行代码时,就不能省略大括号{}
    • (参数) -> {代码行;} :如果覆写方法的代码只有一行代码 并且 有返回值 并且 还想写return关键字的话,那就不能省略大括号{}
  • 相关阅读:
    encodeURI() 的用法
    $().each() 与 $.each()区别,以及 jquery ajax 应用
    每日一乐,健康多滋味~~
    IIS部署ASP.NET MVC (4.0)网站出现的错误
    《程序员级别鉴定书》 ----中级.NET开发者
    《转》程序员必须知道的10大基础实用算法及其讲解
    C# 托管资源和非托管资源
    11、E-commerce in Your Inbox:Product Recommendations at Scale-----产品推荐(prod2vec和user2vec)
    二叉树(2)----路径
    10、Latent Relational Metric Learning via Memory-based Attention for Collaborative Ranking-----基于记忆注意的潜在关系度量协同排序
  • 原文地址:https://www.cnblogs.com/haixianet/p/8607195.html
Copyright © 2020-2023  润新知