• 抛开其它看技术本身之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关键字的话,那就不能省略大括号{}
  • 相关阅读:
    14.14DataSet数据集
    C#第六章学习代码
    C#第五章学习代码
    C#第四章学习代码
    C#第三章学习代码
    C#第二章学习的代码
    记录自学学习C#中写过的代码
    14._13数据集DataSet
    C#中数据库连接的几种写法
    视频、图形图像处理之Opencv技术记录(三)、相关文档页面的列表
  • 原文地址:https://www.cnblogs.com/haixianet/p/8607195.html
Copyright © 2020-2023  润新知