首页 > 其他分享 >快速熟悉Lambda表达式

快速熟悉Lambda表达式

时间:2023-12-28 14:31:36浏览次数:29  
标签:Runnable run 接口 线程 熟悉 表达式 Lambda

在Java基础课程中有一个工具非常好用,但不常用就很容易忘记。大家一定已经猜到,它就是Lambda表达式,一个会者不难的工具。今天我们就来快速熟悉下Lambda表达式。

1.没有Lambda表达式的编码习惯

先聊一个简单的面试题,匿名内部类和多态有什么关系?相信大家都会脑补在Java基础部分的内部类知识点。这个面试题的答案很简单,匿名内部类就是多态非常直观的体现。我们来看这个例子:

Runnable runnable = newRunnable() {
      @Override
      public void run() {
          //线程体
          System.out.println("lambda");
      }
  };

Runnable是线程类的上层接口。Runnbale接口的run方法是线程必须要重写的,也称为线程体。我们在使用Runnable来启动线程时就习惯使用上述这种写法,这也是多态的直观体现。但是有没有更简单的方式呢?Lambda表达式来秀一波。

Runnable runnable = () -> System.out.println("Lambda");

2.函数式接口

Lambda表达式实际上就是函数式接口的实现类的对象。因此要了解Lambda表达式,我们得先快速了解下什么是函数式接口。

@FunctionalInterface
public interface Runnable {
    /**
     * Runs this operation.
     */
    void run();
}

这是Runnable接口的源码,Runnable接口就属于函数式接口。我们看到几个特点:

  • 只有一个抽象方法的接口
  • 使用@FuncationInterface注解来标识

3.Lambda表达式实现细节

知道了什么是函数式接口后,我们可以再来理解这句话:“Lambda表达式实际上就是函数式接口的实现类的对象”。此时我们就能明白,原来使用Lambda其实是在创建函数式接口的实现类的对象。

以第1小节为例,我们来看通过Lambda获得对象的演变过程:

  • 先得到函数式唯一的抽象方法的参数列表,并用箭头符号(也称Lambda操作符)分割之后的内容。
Runnable runnable = ()-> {
        //线程体
        System.out.println("lambda");
    }
};

箭头符号的左边"()"实际上就是"public void run()"方法的声明部分。这个括号描述的是run()方法的参数列表,而方法名、返回值类型、权限列表都被省略了。因为该接口只有一个抽象方法,这些内容可以自动被编译器识别。

  • 简化箭头符号右边的内容:

如果只有一行代码,可以直接省略大括号。

Runnable runnable = () -> System.out.println("Lambda");

如果只有一行代码,且有return,则要么省略大括号和return,要么都不能省略。下面使用Lambda表达式创建compator接口对象为例。

//普通操作
Comparator<Integer> comparator1 = new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o1-o2;
    }
};
//使用Lambda表达式创建
Comparator<Integer> comparator2 = (o1, o2) -> o1-o2;

从上述例子中可以快速看出,箭头符号的左边是方法的参数列表,箭头符号的右边是方法体由于只有一行代码,则把大括号和return都省略掉是没有问题的。

好了同学们,使用Lambda表达式简化代码就是这么简单。欢迎继续关注我们的技术分享。

标签:Runnable,run,接口,线程,熟悉,表达式,Lambda
From: https://blog.51cto.com/u_15739596/9014837

相关文章

  • SpringBoot+JaywayJsonPath实现Json数据的DSL(按照指定节点表达式解析json获取指定数
    场景若依前后端分离版手把手教你本地搭建环境并运行项目:若依前后端分离版手把手教你本地搭建环境并运行项目_前后端分离项目本地运行在上面搭建SpringBoot项目的基础上,并且在项目中引入fastjson、hutool等所需依赖后。JaywayJsonPath:GitHub-json-path/JsonPath:JavaJsonPathi......
  • 2023十大前沿科技趋势揭秘!看看有你熟悉的领域吗?(下)
    点击查看原文:2023十大前沿科技趋势揭秘!看看有你熟悉的领域吗?(上)原创|文BFT机器人-Part3 空间计算-06 空间计算概念清晰消费级产品问世,XR全栈链路贯通空间计算,以其独特的计算维度,赋予了内容更加立体的呈现方式,近乎完美地再现了信息。业内外一致认为,空间计算将是下一代主要的计算......
  • lightdb/postgresql中plpgsql、函数与操作符、表达式及其内部实现
    PG_PROCPG_OPERATORpg_opclass用于定义索引上的相关操作符,一般来说是同一类数据类型。pg_opfamiliy定义了相互兼容的数据类型的操作符,关系见https://www.postgresql.org/docs/9.1/catalog-pg-opclass.html。pg8.3引入pg_opfamilies,原因:Create "operatorfamilies" toimprove......
  • Apache Commons JEXL:强大的表达式工具
    第1章:引言大家好,我是小黑,今天咱们来聊聊ApacheCommonsJEXL。可能有些朋友对这个名字感到陌生,没关系,咱们慢慢来解释。JEXL,全称是JavaExpressionLanguage,中文意思就是Java表达式语言。它能让咱们在编程时更灵活、更高效地处理各种复杂的逻辑。说到表达式语言,可能咱们首先想到......
  • C# Replace:一个熟悉而又陌生的替换
    C#Replace:一个熟悉而又陌生的替换 阅读目录前言一、String.Replace()的几个重载1、Replace(Char,Char)2、String.Replace(String,String) 3、Replace(String,String,StringComparison)4、Replace(String,String,Boolean,CultureInfo)二、Regex.Replace......
  • 正则表达式
    JavaScript中的正则表达式是一种强大的文本处理工具,它可以用于匹配、搜索、替换和拆分字符串。正则表达式的基本语法如下:^:匹配输入字符串的开始位置。$:匹配输入字符串的结束位置。.:匹配除换行符以外的任何字符。*:匹配前面的子表达式零次或多次。+:匹配前面的子表达式一次或......
  • springboot注解表达式
    ("execution(*com.aop..*.*(..))")1、execution():表达式主体2、第一个*号:表示返回类型,*号表示所有的类型3、.包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包4、第二个*号:表示类名,号表示所有的类5、.*(..):最后这个星号表示方法名,号表示所有的方法,后......
  • MPJLambdaWrapper
    https://mybatisplusjoin.com/pages/quickstart/js.html MPJLambdaWrapper<ProProjectNodeIntentionEntity>wrapper=newMPJLambdaWrapper<ProProjectNodeIntentionEntity>(); wrapper.selectAll(ProProjectNodeIntentionEntity.class); wrapper.select(......
  • 万字带你熟悉静态分析工具的评估测试
    本文分享自华为云社区《静态分析工具的评估测试》,作者:Uncle_Tom。1.垂直极限还是先说故事。那是2014年参加的一个测试驱动(TDD)的培训,培训是TDD推广的志愿者组织的,在一个咖啡馆里搞的,周末两天的免费培训。培训过程中的一张图和一个视频让我至今记忆尤新。1.1.一张图上......
  • Kotlin的范围表达式
    Kotlin的范围表达式提供了一种非常方便的方法来表示一个序列,例如数字的序列、字符的序列等。以下是Kotlin中常见的范围表达式的使用方法:1.使用..操作符创建范围:valaToZ='a'..'z'//包括从'a'到'z'的所有字符valoneToTen=1..10//包括从1到10的所有整数2.使用unti......