IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> java是如何简化成一行代码的?-----Lambda表达式初识 -> 正文阅读

[Java知识库]java是如何简化成一行代码的?-----Lambda表达式初识

? ? ? ? 嗨喽~小伙伴们,早上好,中午好,晚上好呀,

????????之前有一个小伙伴给我发了一段代码,说是看不懂,这段代码是这样的:


public class Aha  {

    public static void main(String[] args) {

        Care iCare = () -> System.out.println("Hahahahaha~");
           
        iCare.care();
    }

}


interface Care{
    void care();
}




? ? ? ? 如果屏幕面前的你也不是很能够理解,且听我细讲吧。

????????首先,在理解上述代码之前,我们需要了解一个概念-----函数式接口

? ?问:什么叫函数式接口?

????????????概念其实很简单,所谓函数式接口,是指只定义了一个抽象方法的接口

? ? ? ? 比如如下的接口便是一个最简单的函数式接口:

interface Care{
    void care();
}

? ? ? ? ?如果你对jdk的源码有过深入研究的话,

????????会发现javaAPI中也提供了许多函数式接口,比如我们熟悉的Runnable接口和Callable接口:

? ? ? ? 细心的小伙伴会发现,上面两段源码中均对接口加上了一个注解:@FunctionalInterface?,顾名思义,这表示该接口会被设计成一个函数式接口,不符合规范的话,编译时会报错。

? ? ? ? 那么问题来了,将接口设计成函数式接口有什么好处呢?

? ? ? ? 我们通过一个例子来领会它的妙处,首先,上一段简单的代码:


public class Haha  {

    public static void main(String[] args) {
        ILike iLike = new Like();
        iLike.like();
    }

}

interface ILike{
    void like();
}

//普通实现类
class Like implements ILike{
    @Override
    public void like() {
        System.out.println("我是易果啥笔");
    }
}

? ? ? ? 相信学过接口的小伙伴们能够很轻松地看懂上面这段代码。

????????现在我们深入地想一想,如果ILike这个接口仅仅是在Haha这个类中使用,那我们没必要新建一个外部Like实现类,一个很自然的想法便是将Like实现类设计成静态内部类


public class Haha  {

    //静态内部类
    static class Like implements ILike{
        @Override
        public void like() {
            System.out.println("我是易果啥笔");
        }
    }


    public static void main(String[] args) {

        ILike iLike = new Like();
        iLike.like();

        }
    }
}


interface ILike{
    void like();
}




? ? ? ? 既然想到了设计成静态内部类,为何不干脆设计成局部内部类呢:


public class Haha  {

    public static void main(String[] args) {

        ILike iLike = new Like();
        iLike.like();


        //局部内部类
        class Like implements ILike{
            @Override
            public void like() {
                System.out.println("我是易果啥笔");
            }
        }
    }

}


interface ILike{
    void like();
}

? ? ? ? 进一步,如果你学过匿名内部类的话,咱还可以把实现类的类名Like省略,简化成:


public class Haha  {

   
    public static void main(String[] args) {

        ILike iLike = new ILike() {
            @Override
            public void like() {
                System.out.println("我是易果啥笔");
            }
        }; //注意此处要有一个分号结尾

        iLike.like();
    }
}


interface ILike{
    void like();
}


? ? ? ? 现在,我们来看核心代码:

ILike iLike = new ILike() {
            @Override
            public void like() {
                System.out.println("我是易果啥笔");
            }
        };

? ? ? ? 上面这段代码,已经把实现接口的类的类名给省略了,我们想一想,还能不能省略点东西?

????????实际上,iLike前面已有ILike修饰,故后面的“new ILike”字样完全可以省略,不会产生歧义。

????????而且,重点来了!!!由于ILike本身是一个函数式接口,它只有一个抽象方法 like() ,所以上面的代码中完全可以把重写的like()方法中的“死代码”去掉而不会产生歧义,甚至花括号也可以去掉,直接写成:

????????ILike iLike = () ?System.out.println ( " 我是易果啥笔 " )?;

? ? ? ? 当然,在?jdk8(或更高)规范中,需要我们加上一个小箭头“ -> ”:


ILike iLike = () ->  System.out.println("我是易果啥笔");
       

? ? ? ? 到这,我们已经将一个复杂的代码块缩短成了最简单的一行代码,这种用“->”符号来编写的表达式,便称为匿名表达式,也叫Lambda表达式。从上述过程可以看出,Lambda表达式的优点在于能够使代码变得更为简洁

????????注意,能够将代码缩短至一行是有一定条件的,下面的代码列举的应该包含绝大多数情况了:



//如果接口实现的语句不止一个,则必须加上花括号{},这与if,for,while语法类似:
ILike iLike = () -> {
    System.out.println("我是易果啥笔");
    System.out.println("我是易果啥笔2");
};

//如果接口含且仅含有一个参数(比如含有int a,这时可以省略括号和申明:int)
ILike iLike = a -> System.out.println("我是易果啥笔");

//如果接口含有多个参数(比如含有int a,String b,这时不能省略括号,但仍可以省略申明:int和String)
ILike iLike = (a,b) -> System.out.println("我是易果啥笔");


? ? ? ? 理解到这,我想小伙伴们应该就能够理解本文最开始给出的那段代码了,其实就是一个简单的Lambda表达式而已:


public class Aha  {

    public static void main(String[] args) {

        Care iCare = () -> System.out.println("Hahahahaha~");
           
        iCare.care();
    }

}


interface Care{
    void care();
}



? ? ? ? 事实上,Lambda表达式的应用远不止这些,有兴趣的小伙伴可以去查询更多的资料了解Lambda表达式的其他应用。

? ? ? ? 那么今天的知识就分享到这里啦,喜欢的小伙伴们点个赞鼓励支持一下吧~

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-26 11:59:28  更:2021-08-26 12:01:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 9:43:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码