当前位置:首页 > 科技  > 软件

微服务为什么要容器化?

来源: 责编: 时间:2024-09-10 09:51:13 170观看
导读Lambda 表达式是 Java 8 引入的一种简洁的表示匿名方法的方式,使用它可以用于替代某些匿名内部类对象,从而让程序更简洁,可读性更好。但 Lambda 表达式的底层是如何实现的呢?接下来我们一起来看。1.未Lambda表达式未使用

Lambda 表达式是 Java 8 引入的一种简洁的表示匿名方法的方式,使用它可以用于替代某些匿名内部类对象,从而让程序更简洁,可读性更好。但 Lambda 表达式的底层是如何实现的呢?接下来我们一起来看。7hV28资讯网——每日最新资讯28at.com

1.未Lambda表达式

未使用 Lambda 表达式之前,我们创建一个线程,可以这样写:7hV28资讯网——每日最新资讯28at.com

Thread t1 = new Thread(new Runnable() {    @Override    public void run() {        System.out.println("t1");    }});t1.start();

其中 Runnable 匿名内部类,查看 Runnable 源码,我们可以看到 Runnable 的实现如下:7hV28资讯网——每日最新资讯28at.com

图片图片7hV28资讯网——每日最新资讯28at.com

1.1 什么是匿名内部类?

匿名内部类是在 Java 中定义的一个没有名称的内部类。它通常在一个类的成员位置或者方法体内直接定义,并且立即实例化。7hV28资讯网——每日最新资讯28at.com

匿名内部类的主要用途在于简化代码,避免为了实现一个简单的功能而定义一个完整的类。它特别适用于只需要一次使用的类,比如实现一个接口的单方法(即函数式接口)的场合。7hV28资讯网——每日最新资讯28at.com

PS:自从 Java 8 引入 Lambda 表达式后,很多原本使用匿名内部类的地方可以被更简洁的 Lambda 表达式替代。7hV28资讯网——每日最新资讯28at.com

上面代码中的 new Runnable 就是一个标准匿名内部类的使用。7hV28资讯网——每日最新资讯28at.com

1.2 什么是@FunctionalInterface?

@FunctionalInterface 是 Java 8 引入的一个注解,它用于标记一个接口为函数式接口7hV28资讯网——每日最新资讯28at.com

函数式接口是指只包含一个抽象方法的接口。这个注解虽然不是必需的,但它提供了一种明确的方式告诉编译器和开发者,这个接口是设计为函数式接口的。7hV28资讯网——每日最新资讯28at.com

@FunctionalInterface 注解的作用如下:7hV28资讯网——每日最新资讯28at.com

  • 编译时检查:当一个接口被标记为 @FunctionalInterface 时,编译器会检查该接口是否只有一个抽象方法。如果不符合函数式接口的定义(即存在多个抽象方法),编译器会报错,提醒开发者修正。这为开发者提供了明确的编译时保障,确保所标记的接口确实符合函数式接口的要求。
  • 代码明确性:即使不加 @FunctionalInterface 注解,只要接口符合函数式接口的定义,它仍然可以被视为函数式接口。但注解的存在增加了代码的明确性和可读性,使得其他开发者更容易理解该接口的设计意图。
  • 支持 Lambda 表达式:函数式接口的主要目的是为了支持 Lambda 表达式。通过 Lambda 表达式,开发者可以以更简洁的方式实现函数式接口的抽象方法,从而减少模板代码,使代码更加简洁和易于理解。由于 Lambda 表达式本身不包含类型信息,Java 编译器需要一种机制来确定 Lambda 表达式对应的目标类型。函数式接口就扮演了这一角色——Lambda 表达式可以被赋值给任何兼容的函数式接口类型,编译器会依据接口的唯一抽象方法来推断 Lambda 表达式的参数类型和返回类型。

在 Java 标准库中,有许多使用 @FunctionalInterface 注解的接口,如 java.util.function 包下的 Function、Predicate、Consumer 等,这些接口都是函数式接口,广泛用于数据处理、过滤、转换等操作。此外,在 Spring Boot 框架中,也经常使用函数式接口来定义事件监听器、回调函数等。7hV28资讯网——每日最新资讯28at.com

2.使用Lambda表达式

未使用 Lambda 表达式之前,我们创建一个线程是这样写的:7hV28资讯网——每日最新资讯28at.com

Thread t1 = new Thread(new Runnable() {    @Override    public void run() {        System.out.println("t1");    }});t1.start();

而用了 Lambda 表达式,我们可以这样写:7hV28资讯网——每日最新资讯28at.com

Thread t1 = new Thread(() -> { System.out.println("t1"); });t1.start();

从上述代码可以看出,当我们使用 Lambda 表达式之后,代码就变得更简洁和优雅了。7hV28资讯网——每日最新资讯28at.com

3.Lambda详解

Lambda 表达式的语法形式如下:7hV28资讯网——每日最新资讯28at.com

(parameters) -> expression

或者是:7hV28资讯网——每日最新资讯28at.com

(parameters) -> { statements; }

以上语法含义如下:7hV28资讯网——每日最新资讯28at.com

  • 参数列表:在圆括号内的部分,用于定义传递给 Lambda 体的参数。参数列表可以为空,也可以包含多个参数,参数之间用逗号隔开。
  • 箭头符号是 Lambda 表达式的分隔符,将参数列表与表达式或语句块分隔开。
  • Lambda 体:包含了具体的执行逻辑,可以是一个表达式或是一个由多个语句组成的代码块。

3.1 使用场景

Lambda 表达式主要用于执行函数式接口(Function Interface),即只有一个抽象方法的接口。常见的函数式接口包括 java.util.function 包下的 Predicate、Function、Consumer 等。7hV28资讯网——每日最新资讯28at.com

3.2 举个例子

假设我们有一个List,并且我们想要对这个列表进行过滤操作,只保留偶数元素。使用 Lambda 表达式可以非常方便地实现这一功能:7hV28资讯网——每日最新资讯28at.com

import java.util.Arrays;import java.util.List;import java.util.stream.Collectors;public class Main {    public static void main(String[] args) {        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);        // 使用 Lambda 表达式过滤出偶数        List<Integer> evenNumbers = numbers.stream()                                           .filter(n -> n % 2 == 0)                                           .collect(Collectors.toList());        System.out.println(evenNumbers); // 输出 [2, 4, 6, 8]    }}

在这个例子中,n -> n % 2 == 0 是一个 Lambda 表达式,它接受一个整数 n 作为输入参数,并返回一个布尔值。这个 Lambda 表达式被用作 filter 方法的参数,该方法期望一个 Predicate类型的函数式接口实例。7hV28资讯网——每日最新资讯28at.com

4.Lambda底层原理

Lambda 底层运行原理如下:7hV28资讯网——每日最新资讯28at.com

在程序运行时,会在类中生成一个匿名内部类,匿名内部类会实现接口,并重写接口中的抽象方法。7hV28资讯网——每日最新资讯28at.com

类中会生成一个静态方法,静态方法中的代码就是 Lambda 表达式中的代码。7hV28资讯网——每日最新资讯28at.com

匿名内部类重写的抽象方法,会调用上一步的静态方法,从而实现 Lambda 代码的执行。7hV28资讯网——每日最新资讯28at.com

所以,综合来说,Lambda 表达式其实是匿名内部类的语法糖,这个语法糖在程序执行时会进行兑现,也就是生成匿名内部类并进行任务执行。7hV28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-112794-0.html微服务为什么要容器化?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 转转搜推排序服务的响应对象序列化优化

下一篇: 面试官:说说Lambda表达式底层原理?

标签:
  • 热门焦点
  • 小米平板5 Pro 12.4简评:多专多能 兼顾影音娱乐的大屏利器

    疫情带来了网课,网课盘活了安卓平板,安卓平板市场虽然中途停滞了几年,但好的一点就是停滞的这几年行业又有了新的发展方向,例如超窄边框、高刷新率、多摄镜头组合等,这就让安卓
  • 6月iOS设备好评榜:第一蝉联榜首近一年

    作为安兔兔各种榜单里变化最小的那个,2023年6月的iOS好评榜和上个月相比没有任何排名上的变化,仅仅是部分设备好评率的下降,长年累月的用户评价和逐渐退出市场的老款机器让这
  • 6月安卓手机好评榜:魅族20 Pro蝉联冠军

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年6月1日至6月30日,仅限国内市场。第一名:魅族20 Pro好评率:95%5月份的时候魅族20 Pro就是
  • 印度登月最关键一步!月船三号今晚进入环月轨道

    8月5日消息,据印度官方消息,月船三号将于北京时间今晚21时30分左右开始近月制动进入环月轨道。这是该探测器能够成功的最关键步骤之一,如果成功将开始围
  • 把LangChain跑起来的三个方法

    使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain跑起来
  • 自动化在DevOps中的力量:简化软件开发和交付

    自动化在DevOps中扮演着重要角色,它提升了DevOps的效能。通过自动化工具和方法,DevOps团队可以实现以下目标:消除手动和重复性任务。简化流程。在整个软件开发生命周期中实现更
  • 新电商三兄弟,“抖快红”成团!

    来源:价值研究所作 者:Hernanderz 随着内容电商的概念兴起,抖音、快手、小红书组成的&ldquo;新电商三兄弟&rdquo;成为业内一股不可忽视的势力,给阿里、京东、拼多多带去了巨大压
  • 重估百度丨大模型,能撑起百度的“今天”吗?

    自象限原创 作者|程心 罗辑2023年之前,对于自己的&ldquo;今天&rdquo;,百度也很迷茫。&ldquo;新业务到 2022 年底还是 0,希望 2023 年出来一个 1。&rdquo;这是2022年底,李彦宏
  • 英特尔Xe HPG游戏显卡:拥有512EU,单风扇版本

    据10 月 30 日外媒 TheVerge 消息报道,英特尔 Xe HPG Arc Alchemist 的正面实被曝光,不仅拥有 512 EU 版显卡,还拥有 128EU 的单风扇版本。另外,这款显卡 PCB
Top