当前位置: 首页 > news >正文

Lomda表达式与函数式接口

一、概述

Lambda 表达式(也称作箭头函数)是 Java 8 引入的一项重要特性,它使得编写函数式接口的实现更加简洁和直观。Lambda 表达式可以看作是匿名函数,可以在需要函数式接口的地方使用。

我们通过一个例子来感受一下。(创建线程的方式之一)

  • 首先是普通方式
new Thread(new Runnable() {@Overridepublic void run() {System.out.println("Hello from a thread!");}
}).start();
  • 使用 Lambda 表达式
new Thread(() -> System.out.println("Hello from a lambda thread!")).start();

可能第一次接触有些看不懂,后面我们会讲解具体的Lomda语法细节。你就说简不简洁吧。

二、函数式接口

在具体讲解Lomda表达式之前,必须得说说什么是函数式接口。在 Java 中,函数式接口是指只包含一个抽象方法的接口。要注意的是:不是只包含一个方法!!!是只有一个抽象方法,还可以有其他的,如默认方法等。

那为什么会有函数式接口这个东西呢?要知道,在java中,是不允许将函数作为参数进行传递的,而函数式接口相当于给这个方法披上了一件接口的外衣,使得可以作为参数进行传递。

Java 8 中提供了一个注解 @FunctionalInterface,用于标记和检查接口是否为函数式接口。

三、语法规则

以这个抽象接口为例,我们分几步来写

public interface TestLomda{int printNum(int a);
}

首先看看这个方法的一般实现

int printNum(int a){System.out.println(a);
}

下面我们来编写Lomda表达式

  1. 检测是否为函数式接口

    • Lomda表达式只能用在函数式接口上,确保接口只包含一个抽象方法。可以使用 @FunctionalInterface 注解进行测试。
  2. 编写 Lambda 表达式

    Lambda 表达式的语法如下:

    (parameters) -> expression
    

    (parameters) -> { statements; }
    
    • 参数列表
      • 参数类型可以省略,编译器会根据上下文自动推断。
      • 如果只有一个参数,可以省略括号。
      • 如果有多个参数,必须使用括号包围参数列表。
      • 如果参数类型需要显式指定,可以在括号内指定。
    • 箭头 ->
      • 分隔参数列表和 Lambda 表达式的主体。
    • 表达式体
      • 如果 Lambda 表达式的主体是一个简单的表达式,可以直接写在箭头后面。
      • 如果 Lambda 表达式的主体是一个简单的表达式,且该语句是带return的,那么可以省略return
      • 如果 Lambda 表达式的主体包含多条语句,需要用大括号 {} 包围,并使用 return 语句返回结果。

    通过上述规则,我们可以写出

    //首先写出箭头函数的大概轮廓
    ()->{}
    //参数类型可以省
    (a)->{System.out.println(a);}
    //如果只有一个参数,可以省略括号
    a->{System.out.println(a);}
    //如果 Lambda 表达式的主体是一个简单的表达式,可以直接写在箭头后面
    a->System.out.println(a);
    

    四、总结

    Lomda表达式是不是非常简洁呢?这样的简洁性使得在函数传参时,参数列表不会显得特别”臃肿“。但就是由于过于简洁,必然会失去一些可读性,我们在初期可能看不懂,但是没关系,只要我们多写,多看,熟练之后相信你就会熟悉并且爱上这种简洁的写法(毕竟谁也不想多写几行代码吧,哈哈。

    这里给初学者一个建议,在初期练习Londa表达式时,不要想一步就写成最简洁的形式,一步一步来,逐步的省略,多次以后就能比较熟悉了。


http://www.mrgr.cn/news/60706.html

相关文章:

  • Flutter升级与降级
  • 李宇皓现身第十届“文荣奖”,allblack造型帅气绅士引关注
  • MinIO方法封装
  • 部署 Traefik 实现 dashboard 与 原生Ingress使用 CRD IngressRoute使用
  • D3.js 入门指南
  • Unsupervised Domain Adaptation by Backpropagation
  • 爬虫ip与反爬虫的“猫鼠游戏”
  • java基础(Object篇)
  • Python 基础语法 - 赋值运算符
  • auto占位符(C++11~C++17)
  • C语言实现高并发编程——线程池
  • Open3D-Geometry-14:Distance Queries距离查询方法将网格生成为隐式表示
  • 【专题】关系模型的基本理论
  • 使用chatglm API处理论文
  • 排序算法简记
  • 五、Hadoop 分布式文件系统(HDFS)的原理与架构专业解析
  • python 数据结构 1
  • 一文贯通RAG的技术介绍和构建(简易版+附详细代码)
  • 2024年【制冷与空调设备安装修理】考试内容及制冷与空调设备安装修理最新解析
  • Java程序设计:spring boot(12)——定时调度集成 - Quartz
  • 怎么把照片恢复至手机?一文读懂详细教程与多种方法!
  • 从JDK 17 到 JDK 21:Java 新特性
  • 北理工计算机考研难度分析
  • ctfshow(151->154)--文件上传漏洞--.user.ini
  • 热门四款深度数据恢复软件大比拼!!!
  • 一个临床数据收集/调查问卷APP模板(streamlit+MongoDB)