JavaSE-20 【Lambda】

news2024/11/24 15:49:31

文章目录

  • 1 Lambda介绍
    • 1.1 什么是Lambda
    • 1.2 为什么使用Lambda
  • 2 语法标准格式
    • 1.1 语法格式
    • 1.2 格式说明:
    • 1.3 lambda表达式的重要特征
    • 1.4 lambda表达式的常见格式
    • 1.5 语法格式1
    • 1.6 语法格式2
    • 1.7 语法格式3
    • 1.8 语法格式4
    • 1.9 语法格式5
    • 1.10 语法格式6
  • 3 函数式接口
    • 3.1 函数式接口的概念
    • 3.2 函数式接口分类

1 Lambda介绍

1.1 什么是Lambda

Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包,和传统数学上的意义有区别。

Java 8的引入了Lambda表达式,使用它设计的代码会更加简洁。当开发者在编写Lambda表达式时,也会随之被编译成一个函数式接口
在这里插入图片描述

1.2 为什么使用Lambda

可以把Lambda表达式理解为一段可以传递的代码(将代码像数据一样进行传递)。Lambda允许把函数作为一个方法的参数,使用Lambda表达式可以写出更简洁、更灵活的代码,而其作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升

2 语法标准格式

1.1 语法格式

Lambda表达式在Java语言中引入了一个操作符 ->,该操作符被称为Lambda操作符或箭头操作符。它将Lambda分为两个部分:

左侧:指定了Lambda表达式需要的所有参数
右侧:制定了Lambda体,即Lambda表达式要执行的功能

  • 左侧:一些参数
  • 中间:一个箭头
  • 右侧:一段代码

Lambda表达式的标准格式如下:
(参数类型 参数名称) -> {代码语句}

  参数列表   符号    代码
(parameters) ->  expression
(parameters) ->  {statements;}

1.2 格式说明:

(参数类型 参数名称) -> {代码语句}

  • 小括号内的语法与传统方法列表一致:无参数则留空,多个参数使用逗号隔开
  • 符号 -> 是新引入的语法格式,代表指向动作,即goes to
  • 大括号内的语法与传统方法体要求基本一致

1.3 lambda表达式的重要特征

  • 1 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
  • 2 可选的参数圆括号:一个参数无需定义圆括号,但无参数或多个参数需要定义圆括号。
  • 3 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
  • -4 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。

1.4 lambda表达式的常见格式

语法格式1:无参数无返回值
语法格式2:有一个参数,无返回值,或有返回值(return可以省)
语法格式3:有一个参数,无返回值,小括号可以省略
语法格式4:有两个以上参数,有返回值,并且Lammbda 体中有多条语句,多条语句用大括号
语法格式5:有两个以上参数,有返回值,并且Lammbda 体中只有一条语句,
		  return和大括号可以省略不写
语法格式6:Lammbda 表达式参数列表的数据类型可以省略不写,
	      JVM编译器会通过上下文推断出数据类型,即“类型推断”

1.5 语法格式1

无参数无返回值

    //格式1:无参数,无返回值
    @Test
    public void m1(){
        //传统写法
        //匿名内部类创建Runnable接口的实现类对象,并重写run方法
        Runnable r1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("hello,Lambda!");
            }
        };
        r1.run();

        //Lambda写法
        Runnable r2 = ()-> System.out.println("hello,Lambda!");
        r2.run();
    }

在这里插入图片描述

1.6 语法格式2

有一个参数,无返回值,或有返回值(return可以省略)

    //格式2:有一个参数无返回值
    @Test
    public void m2(){
        //创建函数式接口Consumer的实现类对象con
        Consumer<String> con = (x) ->System.out.println(x);
        //调用实现类对象的方法,输出方法的方法的参数值x
        con.accept("Hello Lambda!!");
    }

在这里插入图片描述

1.7 语法格式3

有一个参数,无返回值,小括号可以省略

    //格式3:有一个参数无返回值,小括号可以省略
   @Test
   public void m3(){
       Consumer<String> con = x-> System.out.println(x);
       con.accept("你好 Lambda表达式!!");
   }

在这里插入图片描述

1.8 语法格式4

有两个以上参数,有返回值,并且Lammbda 体中有多条语句,多条语句用大括号

    //格式4:有多个参数,有返回值,并且Lambda表达式中有多条语句,多条语句用大括号
    @Test
    public void m4() {
        //创建函数式界口Comparator的实现类对象
        Comparator<Integer> com = (x, y) -> {
            System.out.println("函数式接口!!");
            //返回值:比较的结果值
            System.out.println(x);
            System.out.println(y);
            return Integer.compare(x, y);
        };
        //赋值调用实现类对象调用方法
        Integer resoult = com.compare(110, 22);
        System.out.println(resoult);
    }

在这里插入图片描述

1.9 语法格式5

有两个以上参数,有返回值,并且Lammbda 体中只有一条语句。return和大括号可以省略不写

    //格式5:有两个以上参数,有返回值,并且Lammbda 体中只有一条语句,return和大括号可以省略不写
    @Test
    public void m5(){
        Comparator<Integer> com = (x,y)->Integer.compare(x,y);
        Integer result = com.compare(119, 33);
        System.out.println(result);
    }

在这里插入图片描述

1.10 语法格式6

Lammbda 表达式参数列表的数据类型可以省略不写,JVM编译器会通过上下文推断出数据类型,即“类型推断”

 Comparator<Integer> com = (Integer x,Integer y) -> Integer.compare(x,y);
 Comparator<Integer> com = (x,y) -> Integer.compare(x,y);
 Comparator<Integer> com 这里指定了数据类型
   //格式6:Lammbda 表达式参数列表的数据类型可以省略不写
    @Test
    public void test6() {
        Comparator<Integer> com = (Integer x,Integer y) -> Integer.compare(x,y);
        Integer result = com.compare(100,200);  //比大小
        System.out.println(result);
    }

在这里插入图片描述

3 函数式接口

3.1 函数式接口的概念

  • 概念:
    一个接口中的抽象方法只有一个,那么这个接口就是一个函数式接口

  • @FunctionalInterface
    使用检测是否是函数式接口,在接口上直接加上注解,如果这个接口是一个函数式接口则不报错,否则编译报错

  • 作用:
    (1)是Lambda表达式的使用前提
    (2)为了表示接口就代表这个抽象方法,所以将名起为函数式接口

3.2 函数式接口分类

在jdk8之后,官方定义了一些常用的函数式接口,如果以后需要使用类似的接口,直接 使用即可,不需要再单独定义。

接口类型接口名抽象方法概述
消费型接口Consumervoid accept(T t) 消费一个参数数据该接口中的方法可以接收一个参数,接收的参数类型由泛型指定,对参数的操作 方式根据该接口的实现类决定,不需要返回值
供给型接口SupplierT get():该方法不需要参数,它会按照某种逻辑,返回一个具体的数据该接口也被称为生产型接口,如果指定了泛型是什么类型,那类中的get方法就会返回 一个该类型的一个具体数据。返回的数据,由该接口的实现类对象决定
函数型接口Function<T,R>R apply(T):接收一个数据,操作数据之后,返回一个新的数据该接口可以接收一个数据,数据的类型根据泛型指定,然后通过该接口的实现类对象对 该数据进行操作,操作之后返回一个新的数据。
断言型接口Predicateboolean test(T t):对数据做出指定的判断该接口是一个判断接口,接口可以接收一个指定泛型的参数,并根据该接口的实现类 对象对该参数做出对应的判断,返回只为boolean类型

在这里插入图片描述

  • 1、消费型接口

在这里插入图片描述

  • 2、供给型接口

在这里插入图片描述

  • 3、函数型接口

在这里插入图片描述

  • 4、断言型接口
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/909633.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

韩语字母及输入法介绍

韩语字母及输入法介绍 字母由来 朝鲜语字母的由来为如下&#xff1a;十五世纪的朝鲜王国世宗大王 和他的集贤殿大臣在思考&#xff0c;创制自己本国的文字&#xff0c;仿照了“天地人思想”和“发音器官的形象”而创制了朝鲜语字母。 ​ 元音是由三个要素而组成的&#xff1…

结构型(一) - 代理模式

一、概念 代理模式&#xff08;Proxy Pattern&#xff09;&#xff1a;它在不改变原始类&#xff08;或叫被代理类&#xff09;代码的情况下&#xff0c;通过引入代理类来给原始类附加新功能。 使用场景&#xff1a;代理模式最常用的一个应用场景就是&#xff0c;在业务系统中…

Lnton羚通算法算力云平台【PyTorch】教程:torch.nn.Softplus

torch.nn.Softplus 原型 CLASS torch.nn.Softplus(beta1, threshold20) 参数 beta (int) – Softplus里β \betaβ 值&#xff0c; 默认为 1. threshold (int) – 高于这个值恢复为线性函数&#xff0c;默认为 20. 图 代码 import torch import torch.nn as nnm nn.Softp…

电工-学习电工有哪些好处

学习电工有哪些好处&#xff1f;在哪学习电工&#xff1f; 学习电工有哪些好处&#xff1f;在哪学习电工&#xff1f;学习电工可以做什么&#xff1f;优势有哪些&#xff1f; 学习电工可以做什么&#xff1f;学习电工有哪些好处&#xff1f; 就业去向&#xff1a;可在企业单位…

Word怎么转换成PDF文档?多个Word转换成PDF步骤分享

word文档是一种非常好用的文件格式&#xff0c;可以帮助用户们很好的保存图片和文字内容&#xff0c;不过并不是只有word这一种文档类文件格式&#xff0c;还有一种pdf文档也深受用户们的欢迎&#xff0c;在工作或者学习过程中这两种文档是可以互相转换格式的&#xff0c;那么W…

如何安装指定版本node.js,安装旧版本node

1、查看当前是否安装node&#xff0c;如果安装了需要先卸载当前版本node 搜索控制面板 -> 找到程序/卸载程序 -> 在里面找到node -> 然后右击卸载 2、卸载完成后就要安装其他版本得node.js 找到想要安装的对应版本&#xff0c;安装.msi格式的安装包 注&#xff…

测试框架pytest教程(9)跳过测试skip和xfail

skip无条件跳过 使用装饰器 pytest.mark.skip(reason"no way of currently testing this") def test_example(faker):print("nihao")print(faker.words()) 方法内部调用 满足条件时跳过 def test_example():a1if a>0:pytest.skip("unsupported …

Unity 之 ScreenPointToRay() (将点转换成射线的方法)

文章目录 ScreenPointToRay() ScreenPointToRay() ScreenPointToRay() 是Unity中Camera类的一个方法&#xff0c;用于将屏幕上的一个点转换为一条射线。这条射线的起点是摄像机在屏幕上对应的点&#xff0c;方向是从摄像机出发指向那个点。这在进行射线命中检测时非常有用&…

如何远程管理服务器详解

文章目录 前言一、远程管理类型二、远程桌面三、telnet 命令行远程四、查看本地开放端口 前言 很多公司是有自己的机房的&#xff0c;机房里面会有若干个服务器为员工和用户提供服务。大家可以想想&#xff1a;假设这家公司有上百台服务器&#xff0c;我们作为网络工程师&…

探究Java spring中jdk代理和cglib代理!

面对新鲜事物&#xff0c;我们要先了解在去探索事物的本质-默 目录 一.介绍二者代理模式 1.1.Jdk代理模式 1.2cglib代理模式 1.3二者区别 1.3.1有无接口 1.3.2灵活性 1.4对于两种代理模式的总结 1.4.1jdk代理模式 1.4.2cglib代理模式 二.两种代理模式应用场景 2.1jd…

测试框架pytest教程(5)运行失败用例-rerun failed tests

# content of test_50.py import pytestpytest.mark.parametrize("i", range(50)) def test_num(i):if i in (17, 25):pytest.fail("bad luck") 运行这个文件&#xff0c;2个失败&#xff0c;48个通过。 要运行上次失败的测试用例&#xff0c;可以使用--l…

框架(Git基础详解及Git在idea中集成步骤)

目录 基础&#xff1a; idea集成Git并添加项目到git仓库 1.idea集成git&#xff0c;集成.git.exe文件 2.初始化本地Git仓库项目 3. 将工作区代码添加到暂存区 4.将暂存区代码添加到本地仓库 5.Git本地库操作 Idea集成Gitee并提交代码到第三方库 1.setting里搜索gitee 2.添…

什么是RNN(循环神经网络)

什么是RNN(循环神经网络) 循环神经网络(Recurrent Neural Network)&#xff0c;在识别图像时&#xff0c;输入的每张图片都是孤立的&#xff0c;认出这张图片是苹果&#xff0c;并不会对认出下一张图片是梨造成影响。 但对语言来说&#xff0c;顺序是十分重要的&#xff0c;“…

Lua与C++交互(一)————堆栈

Lua与C交互&#xff08;一&#xff09;————堆栈 Lua虚拟机 什么是Lua虚拟机 Lua本身是用C语言实现的&#xff0c;它是跨平台语言&#xff0c;得益于它本身的Lua虚拟机。 虚拟机相对于物理机&#xff0c;借助于操作系统对物理机器&#xff08;CPU等硬件&#xff09;的一…

Java【手撕双指针】LeetCode 1089. “复写零“, 图文详解思路分析 + 代码

文章目录 前言一、复写零1, 题目2, 思路分析2.1, 从左往右 or 从右往左2.2, 找到最后一个保留的数 3, 代码展示 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: &#x1f4d5; JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管…

SpringCloud Gateway服务网关的介绍与使用

目录 1、网关介绍2、SpringCloudGateway工作原理3、三大组件3.1 、Route&#xff08;路由&#xff09;3.2、断言 Predicate3.3、过滤器 filter 4、Gateway整合nacos的使用4.1 、引入依赖4.2、 编写基础类和启动类4.3、 编写基础配置和路由规则4.4 、测试结果 1、网关介绍 客户…

营销数字化|企业级 AIGC 工具的「iPhone 时刻」

2007 年&#xff0c;乔布斯发布了第一款 iPhone&#xff0c;从此彻底改变了手机行业的市场走向。iPhone 成功的背后&#xff0c;一个很重要的原因是&#xff1a;它让用户以更简单、更符合直觉的方式来使用手机。 如今&#xff0c;AIGC 工具也在等待它的「iPhone 时刻」&#xf…

C++信息学奥赛1119:矩阵交换行

解题思路&#xff1a;当输出时换行 解题程序&#xff1a; #include<iostream> using namespace std; int main() {int arr[5][5];// 输入矩阵元素for(int i0;i<5;i){for(int j0;j<5;j){cin>>arr[i][j];}} int n,m;cin>>n>>m;// 根据条件进行矩…

RT-Thread学习日记——点亮LED

最近开始接触RT-Thread&#xff0c;后面会单独建立专栏以此记录我的学习过程&#xff0c;如果能给你的学习提供参考&#xff0c;本人倍感荣幸。 学习工具&#xff1a;正点原子战舰开发板 一、、点亮LED 在RT-Thread的配置项里搜索LED可以看到和LED相关的很多内容&#xff0c…

AutoDev 1.1.3 登场,个性化 AI 辅助:私有化大模型、自主设计 prompt、定义独特规则...

在过去的半个月里&#xff0c;我们为开源辅助编程工具 AutoDev 添加了更强大的自定义能力&#xff0c;现在你可以&#xff1a; 使用自己部署的开源大模型自己配置 Intellij IDEA 中的行为自定义开发过程中的规范 当然了&#xff0c;如果您自身拥有开发能力的话&#xff0c;建议…