Lambda表达式的进化之路

为什么要使用Lambda表达式

  • 可以简洁代码,提高代码的可读性
  • 可以避免匿名内部类定义过多导致逻辑紊乱
  • 在原先实现接口抽象方法的时候,需要通过定义一个实现接口的外部类来实现,后面变为定义内部静态类,然后变为用局部内部类实现,再后面变成了定义匿名内部类来实现,最后的最后,为了代码的更加简洁,推出了Lambda表达式,最终实现了用一行代码完成之前多行代码的效果

Lambda表达式的注意点

  • Lambda表达式实际上属于是函数式编程的概念,所以在使用的时候要知道是否属于函数式编程

  • Lambda表达式的实现依赖于接口和父类,所以必须有两者之一才能实现Lam表达式

  • Lambda表达式实现的接口中要求只有一个抽象方法,如果有多个抽象方法就无法使用Lambda表达式来编程

  • Lambda表达式即适用于无参方法,也适用于含参方法

  • Lambda表达式最早在JDK 8中开始出现,所以只有 JDK 8 以后的版本才支持


下面是Lambda表达式的实现过程

  1. 最开始使用的是定义外部实现类来完成接口

    public class tt1 {
    public static void main(String[] args) {
    //用外部类来实现接口,首先需要在主类外定义另外一个类,之后再在内部类中创建对象
    //这样对于那些只需要使用一次的接口来说比较的麻烦,而且也会使整个代码变得臃肿,给其他开发人员带来阅读困难
    lover l1 = new lover();
    l1.love();
    }
    }
    //定义接口
    interface ILove {
    void love();
    }
    //外部实现类
    class lover implements ILove{
    @Override
    public void love() {
    System.out.println("I love you my lover ---> 1");
    }
    } //输出为:I love you lover ---> 1
  2. 开始使用静态内部类来实现

    public class tt1 {
    //静态内部类
    static class lover2 implements ILove{
    @Override
    public void love() {
    System.out.println("I love you my lover ---> 2");
    }
    }
    public static void main(String[] args) {
    //用外部类来实现接口,首先需要在主类外定义另外一个类,之后再在内部类中创建对象
    //这样对于那些只需要使用一次的接口来说比较的麻烦,而且也会使整个代码变得臃肿,给其他开发人员带来阅读困难
    ILove l1 = new lover1();
    l1.love();
    //使用静态内部类来实现,由于实现类和main方法位于相同主类中,方便了开发人员阅读,但是实现过程还是比较麻烦
    ILove l2 = new lover2();
    l2.love();
    }
    }
    //定义一个函数式接口
    interface ILove {
    void love();
    }
    //外部实现类
    class lover1 implements ILove{
    @Override
    public void love() {
    System.out.println("I love you my lover ---> 1");
    }
    } //输出为:I love you my lover ---> 1
    // I love you my lover ---> 2
  3. 使用局部内部类使用

    public class tt1 {
    //静态内部类
    static class lover2 implements ILove{
    @Override
    public void love() {
    System.out.println("I love you my lover ---> 2");
    }
    } public static void main(String[] args) { //用外部类来实现接口,首先需要在主类外定义另外一个类,之后再在内部类中创建对象
    //这样对于那些只需要使用一次的接口来说比较的麻烦,而且也会使整个代码变得臃肿,给其他开发人员带来阅读困难
    ILove l1 = new lover1();
    l1.love();
    //使用静态内部类来实现,由于实现类和main方法位于相同主类中,方便了开发人员阅读,但是实现过程还是比较麻烦
    ILove l2 = new lover2();
    l2.love(); //局部内部类
    class lover3 implements ILove{
    @Override
    public void love() {
    System.out.println("I love you my lover ---> 3");
    }
    }
    ILove l3 = new lover3();
    l3.love(); }
    }
    //定义一个函数式接口
    interface ILove {
    void love();
    }
    //外部实现类
    class lover1 implements ILove{
    @Override
    public void love() {
    System.out.println("I love you my lover ---> 1");
    }
    } //输出为:I love you my lover ---> 1
    // I love you my lover ---> 2
    // I love you my lover ---> 3
  4. 使用匿名内部类实现接口

    public class tt1 {
    //静态内部类
    static class lover2 implements ILove{
    @Override
    public void love() {
    System.out.println("I love you my lover ---> 2");
    }
    } public static void main(String[] args) { //用外部类来实现接口,首先需要在主类外定义另外一个类,之后再在内部类中创建对象
    //这样对于那些只需要使用一次的接口来说比较的麻烦,而且也会使整个代码变得臃肿,给其他开发人员带来阅读困难
    ILove l1 = new lover1();
    l1.love();
    //使用静态内部类来实现,由于实现类和main方法位于相同主类中,方便了开发人员阅读,但是实现过程还是比较麻烦
    ILove l2 = new lover2();
    l2.love(); //局部内部类
    class lover3 implements ILove{
    @Override
    public void love() {
    System.out.println("I love you my lover ---> 3");
    }
    }
    ILove l3 = new lover3();
    l3.love(); //使用内部匿名类
    ILove l4 = new ILove() {
    @Override
    public void love() {
    System.out.println("I love you my lover ---> 4");
    }
    }; }
    }
    //定义一个函数式接口
    interface ILove {
    void love();
    }
    //外部实现类
    class lover1 implements ILove{
    @Override
    public void love() {
    System.out.println("I love you my lover ---> 1");
    }
    } //输出为:I love you my lover ---> 1
    // I love you my lover ---> 2
    // I love you my lover ---> 3
    // I love you my lover ---> 4
  5. 最后使用Lambda表达式实现函数式接口

    public class tt1 {
    //静态内部类
    static class lover2 implements ILove{
    @Override
    public void love() {
    System.out.println("I love you my lover ---> 2");
    }
    } public static void main(String[] args) { //用外部类来实现接口,首先需要在主类外定义另外一个类,之后再在内部类中创建对象
    //这样对于那些只需要使用一次的接口来说比较的麻烦,而且也会使整个代码变得臃肿,给其他开发人员带来阅读困难
    ILove l1 = new lover1();
    l1.love();
    //使用静态内部类来实现,由于实现类和main方法位于相同主类中,方便了开发人员阅读,但是实现过程还是比较麻烦
    ILove l2 = new lover2();
    l2.love(); //局部内部类
    class lover3 implements ILove{
    @Override
    public void love() {
    System.out.println("I love you my lover ---> 3");
    }
    }
    ILove l3 = new lover3();
    l3.love(); //使用内部匿名类
    ILove l4 = new ILove() {
    @Override
    public void love() {
    System.out.println("I love you my lover ---> 4");
    }
    };
    l4.love(); //使用Lambda表达式实现接口
    ILove l5 = () ->{
    System.out.println("I love you my lover ---> 5");
    };
    l5.love();
    }
    }
    //定义一个函数式接口
    interface ILove {
    void love();
    }
    //外部实现类
    class lover1 implements ILove{
    @Override
    public void love() {
    System.out.println("I love you my lover ---> 1");
    }
    } //输出为:
    I love you my lover ---> 1
    I love you my lover ---> 2
    I love you my lover ---> 3
    I love you my lover ---> 4
    I love you my lover ---> 5

关于Lambda表达式的更加极致的简化(针对有参数的Lambda表达书)

  • 简化数据类型 在Lambda表达式中可以将参数的数据类型省略,只留下一个数据名称。比较特殊的是如果有多个参数,省略的时候应该将所有参数的数据类型都省略,不然就全部不省略,而且需要用括号将参数包含在内。
  • 省略括号 参照上一条,只有一个参数要求的时候才可以省略括号
  • 省略花括号 在Lambda表达式中,只有当输出语句或者代码只有一行的时候可以省略花括号。假如有多条执行代码,还是需要用花括号将代码包含在内

Java中Lambda表达式的进化之路的更多相关文章

  1. Java中lambda表达式详解

    原文地址:http://blog.laofu.online/2018/04/20/java-lambda/ 为什么使用lambda 在java中我们很容易将一个变量赋值,比如int a =0;int ...

  2. Java中Lambda表达式的使用

    简介(译者注:虽然看着很先进,其实Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能.本人建议不要乱用,因 ...

  3. Java中Lambda表达式的使用(转)

    https://www.cnblogs.com/franson-2016/p/5593080.html 简介(译者注:虽然看着很先进,其实Lambda表达式的本质只是一个"语法糖" ...

  4. 快速掌握Java中Lambda表达式的用法

    Lambda表达式的作用: Lambda表达式的作用就是简化代码开发,让代码看起来更加简介.它是用来简化匿名内部类的.但是并不是所有的匿名内部类都能用Lambda表达式简化,Lambda表达式是有使用 ...

  5. Java中Lambda表达式的简单使用

    Lambda表达式是Java SE 8中一个重要的新特性.你可以把 Lambda表达式 理解为是一段可以传递的代码 (将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风格 ...

  6. Java中lambda(λ)表达式的语法

    举一个排序的例子,我们传入代码来检查一个字符串是否比另一个字符串短.这里要计算: first.length() - second.length() first和second是什么?他们都是字符串.Ja ...

  7. 为什么Java中lambda表达式不能改变外部变量的值,也不能定义自己的同名的本地变量呢?

    作者:blindpirate链接:https://www.zhihu.com/question/361639494/answer/948286842来源:知乎著作权归作者所有.商业转载请联系作者获得授 ...

  8. Java中Lambda表达式基础及使用详解

    概述 Lambda 是JDK 8 的重要新特性.它允许把函数作为一个方法的参数(函数作为参数传递进方法中),使用 Lambda 表达式可以使代码变的更加简洁紧凑,使Java代码更加优雅. 标准格式 三 ...

  9. Java中lambda表达式学习

    一.Lambda表达式的基础语法: Java8中引入了一个新的操作符"->"该操作符称为箭头操作符或Lambda操作符,箭头操作符将Lambda表达式拆分为两部分: 左侧:L ...

随机推荐

  1. TypeScript与面向对象

    目录 1.引 2.类(class) 3.构造函数和this 4.继承 5.super 6.抽象类 7.接口 8.属性的封装 9.泛型 1.引 简而言之就是程序之中所有的操作都需要通过对象来完成.一切操 ...

  2. linux7可以通过远程和localhost访问mysql,但是127.0.0.1不能访问

    网上搜索的其他方法都试过,不行 比如设置权限,开放端口,配置数据库... 最好偶然一个搜索查看可能原因是防火墙端口问题: vim /etc/sysconfig/iptables 在文件中添加下面语句 ...

  3. Batch Size对神经网络训练的影响

    ​ 前言 这篇文章非常全面细致地介绍了Batch Size的相关问题.结合一些理论知识,通过大量实验,文章探讨了Batch Size的大小对模型性能的影响.如何影响以及如何缩小影响等有关内容. 本文来 ...

  4. nginx rewrite重写规则集合

    本文根据网络搜索整理,不是原创 一.正则表达式匹配,其中: ~ 为区分大小写匹配 ~* 为不区分大小写匹配 !~和!~* 分别为区分大小写不匹配及不区分大小写不匹配 . 匹配除换行符以外的任意字符 \ ...

  5. 自学 Java开发(Java后台开发|Java后端开发)的书籍推荐

    java编程思想java并发编程实战深入理解java虚拟机函数式编程思维tcp/ip详解鸟哥的linux私房菜spring mvc +mybatis开发从入门到精通spring技术内幕elastics ...

  6. 鸿蒙内核源码分析(静态链接篇) | 完整小项目看透静态链接过程 | 百篇博客分析OpenHarmony源码 | v54.01

    百篇博客系列篇.本篇为: v54.xx 鸿蒙内核源码分析(静态链接篇) | 完整小项目看透静态链接过程 | 51.c.h.o 下图是一个可执行文件编译,链接的过程. 本篇将通过一个完整的小工程来阐述E ...

  7. 前端从web服务器或者CDN下载资源

    前段时间听到前端同学说前端拿到资源的CDN链接后可以直接从CDN下载资源,不需要经过后端,感觉很神奇,但是一致不明白是怎么实现的,前两天整理了下关于CDN和对象存储的知识,今天搜了下前端直接下载资源的 ...

  8. SpringBoot之网站的登陆注册逻辑

    网站的登录注册实现逻辑 该文章主要是为了整理之前学习项目中的知识点,并进行一定程度的理解. 技术列表: SpringBoot MySQL redis JWT 用户登录逻辑: 首先打开前端登录页面,F1 ...

  9. Go语言核心36讲(Go语言基础知识二)--学习笔记

    02 | 命令源码文件 我们已经知道,环境变量 GOPATH 指向的是一个或多个工作区,每个工作区中都会有以代码包为基本组织形式的源码文件. 这里的源码文件又分为三种,即:命令源码文件.库源码文件和测 ...

  10. 一文学会Java事件机制

    本文同时发布于个人网站 https://ifuyao.com/blog/java-event/ 相信做 Java 开发的朋友,大多都是学习过或至少了解过 Java GUI 编程的,其中有大量的事件和控 ...