14.Lambda表达式、可变参数

news2024/9/24 13:25:11

一.Lambda表达式

1.1 函数式接口

1.什么是函数式接口

在Java中,函数式接口是指只包含单个抽象方法的接口,但它也可以有其他方法,例如默认方法和静态方法。函数式接口可以使用Lambda表达式或方法引用来创建该接口的实例。Java 8引入了函数式接口的概念,以便更方便地使用Lambda表达式和函数式编程。函数式接口可以使用 @FunctionalInterface 注解进行标记,这样编译器会检查该接口是否符合函数式接口的定义。

2.函数式接口的定义

@FunctionalInterface 是 Java 8 中专门为函数式接口引入的注解,使用该注解来定义接口,编译器将会强制检查该接口是否确实有且仅有一个抽象方法,否则将会报错。需要注意的是,即使不使用该注解,只要满足函数式接口的定义,这仍然是一个函数式接口,使用起来都一样。 

//定义函数式接口
@FunctionalInterface
interface MyFunctionalInterface {
    void doSomething();
}

3.函数式接口的作用

  • 作为方法的参数。当将函数式编程接口作为方法的参数时,在调用方法时使用方法引用来传入具体的实现,这个方法引用相当于一个实现了函数式编程接口中抽象方法的匿名内部类的对象

  • 在创建匿名内部类时,如果匿名内部类是只有一个抽象方法的函数式接口,在花括号中可以使用Lambda表达式代替方法。

4.JDK中常用的函数式接口

Supplier接口

java.util.function.Supplier<T> 接口仅包含一个无参的方法: T get() 。用来获取一个泛型参数指定
类型的对象数据。由于这是一个函数式接口,这也就意味着对应的 Lambda 表达式需要 “ 对外提供 ” 一个符合泛型类型的对象数据。

Consumer接口 

java.util.function.Consumer<T> 接口则正好与 Supplier 接口相反,它不是生产一个数据,而是消费一个数据,其数据类型由泛型决定。Consumer 接口中包含抽象方法 void accept(T t) ,意为消费一个指定泛型的数据。基本使用如:

Predicate接口

有时候我们需要对某种类型的数据进行判断,从而得到一个 boolean 值结果。这时可以使用
java.util.function.Predicate<T> 接口。Predicate 接口中包含一个抽象方法: boolean test(T t) 。用于条件判断的场景:

Function接口

java.util.function.Function<T,R> 接口用来根据一个类型的数据得到另一个类型的数据,前者称为
前置条件,后者称为后置条件。Function 接口中最主要的抽象方法为:R apply(T t) ,根据类型 T 的参数获取类型 R 的结果。

Function 源码

package java.util.function;

import java.util.Objects;

@FunctionalInterface
public interface Function<T, R> {

    R apply(T t);

  
    default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
        Objects.requireNonNull(before);
        return (V v) -> apply(before.apply(v));
    }

    default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
        Objects.requireNonNull(after);
        return (T t) -> after.apply(apply(t));
    }

    /**
     * 它返回一个恒等函数,该函数接受一个参数并返回相同的参数。
     */
    static <T> Function<T, T> identity() {
        return t -> t;
    }
}

使用场景:以 String 类型转换为 Integer 类型为例,说明 Function 接口的使用场景。

1.2 Lambda表达式

1.什么是Lambda表达式

Lambda 表达式是简化函数式接口的代码写法。也就是说,如果接口中有多个抽象方法,则无法使用Lambda表达式。Lambda 表达式的主要作用有:

  • 当我们用匿名内部类作为函数式接口的实现类时,匿名内部类花括号中的方法我们可以用 lambda 表达式的方式来书写。

  • Lambda 表达式可以作为方法的参数传入到方法中。

2.Lambda表达式的格式

(方法的形参列表) -> {方法体}

3.Lambda表达式的省略写法

  • 在Lambda表达式的基础上继续简化

  • 参数类型可以省略不写

  • 如果只有一个参数,方法参数的括号也可以省略

  • 如果Lambda表达式的方法体只有一行代码。可以省略大括号不写,同时要省略分号,如果这行代码是 return 语句,必须省略 return 不写,同时要省略分号。

1.3 方法引用

1.什么是方法引用

方法引用(Method Reference)是Java中的一种简洁的语法,用于直接引用现有类或对象的方法。它提供了一种对已有方法的重用的方式,使得代码更加简洁和可读。

方法引用可以看作是 Lambda 表达式的一种特殊简写形式可以作为 Lambda 表达式的实现。通过方法引用,我们不需要重新编写 Lambda 表达式的实现逻辑,而是直接引用现有的方法。

2.方法引用的语法

类名::方法名

其中,类名可以是类的名称或对象的引用,方法名是需要引用的方法的名称。根据方法的不同,方法引用可以分为四种类型

静态方法引用:使用类名来引用静态方法。

类名::静态方法名

实例方法引用:使用对象的引用来引用实例方法。

对象引用::实例方法名

特定类的任意对象的实例方法引用:使用特定类的任意对象的引用来引用实例方法。

类名::实例方法名

构造方法引用:使用类名来引用构造方法。

类名::new

下面是一个示例,展示了不同类型的方法引用:

import java.util.Arrays;
import java.util.List;

//在下述示例中,我们定义了一个静态方法staticMethod()和一个实例方法instanceMethod()。
//通过不同的方法引用语法,我们可以直接引用这些方法作为Lambda表达式的实现,并应用于集合的
//遍历、转换等操作中。
public class MethodReferenceExample {
    public static void staticMethod(String s) {
        System.out.println("Static method: " + s);
    }

    public void instanceMethod(String s) {
        System.out.println("Instance method: " + s);
    }


    public static void main(String[] args) {
        // 静态方法引用
        List<String> list1 = Arrays.asList("A", "B", "C");
        list1.forEach(MethodReferenceExample::staticMethod);

        // 实例方法引用
        MethodReferenceExample example = new MethodReferenceExample();
        List<String> list2 = Arrays.asList("D", "E", "F");
        list2.forEach(example::instanceMethod);

        // 特定类的任意对象的实例方法引用
        List<String> list3 = Arrays.asList("G", "H", "I");
        list3.forEach(String::toUpperCase);

        // 构造方法引用
        List<Integer> list4 = Arrays.asList(1, 2, 3);
        list4.stream().map(Integer::new).forEach(System.out::println);
    }
}

进行方法引用的类里可以有多个方法

二.可变长参数

可变长参数是一种语法糖,在编译后实际上是一个对应类型的数组。可变参数让方法在接收参数时非常灵活。可以接收一个参数、多个参数,不接收参数、一个数组。其格式为:

public void 方法名(数据类型...参数名称){
}

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

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

相关文章

分享一个基于SpringBoot的大学生创新能力培养平台Java(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

七夕表白代码包

目录 1.像素爱心代码 2.心动爱心代码 3.问答样式代码 1.像素爱心代码 今年的最火的当然是像素风&#xff0c;一个一个小方块拼成的爱心超级可爱。 (1)桌面新建一个文本档.txt (2)输入以下代码,可以直接复制 <!DOCTYPE html><html><head><meta chars…

Vue项目通过宝塔部署之后,页面刷新后浏览器404页面

目录 报错 解决方法 报错 将vue项目在宝塔上部署&#xff0c; 当项目挂载到服务器上去&#xff0c;进行浏览器的访问&#xff0c;是能正常访问的&#xff0c;可是当我们在浏览器上进行刷新之后&#xff0c;浏览器会给我们返回一个404的页面。 解决方法 &#xff08;1&#…

如何利用 LNMP 搭建 WordPress 站点

作者 乐维社区&#xff08;forum.lwops.cn&#xff09; 许远 在这个信息爆炸的时代&#xff0c;拥有一个能够迅速传达信息、展示个性、并能够与世界互动的在线平台&#xff0c;已成为企业和个人的基本需求。WordPress&#xff0c;以其无与伦比的易用性和强大的扩展性&#xff0…

Redis5-缓存

目录 什么是缓存 添加Redis缓存 缓存更新策略 三种策略 数据库和缓存不一致的解决方案 缓存穿透 缓存雪崩 缓存击穿 缓存工具封装 什么是缓存 缓存是数据交换的缓冲区&#xff08;Cache&#xff09;&#xff0c;是存贮数据的临时地方&#xff0c;一般读写性能较高 多…

【机器学习】BP神经网络中的链式法则

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 BP神经网络中的链式法则1. 引言2. 链式法则基础2.1 什么是链式法则&#xff1f;…

springboot mybatis plus 固定查询条件及可选查询条件的组合查询,使用QueryWrapper.and()来解决。

1、我们在写查询SQL的时候&#xff0c;经常会碰到&#xff0c;比如&#xff0c;同一个类别下的某一个编号的物料信息&#xff0c;或者是同一批次的物料库存问题等等。 所属类别fid物料编号bm物料批次pc110.01.0220240807110.01.0320240807 210.02.0120240805 2、那么我…

定点数的运算

目录 1.定点数的移位运算 1.1算数移位 数学含义&#xff1a; 规律总结&#xff1a; 1.2逻辑移位 1.3循环移位 不带进位位 带进位位 2.定点数的加减运算 3.定点数的乘除运算 3.1原码 一位乘法 除法 3.2补码 一位乘法 除法 1.定点数的移位运算 1.1算数移位 数学…

org.gitlab4j使用报错问题

报错如上&#xff0c;刚开始报错Caused by: java.lang.NoClassDefFoundError: javax/ws/rs/core/StreamingOutput。 原因&#xff1a;项目是JDK17引起的版本不兼容 解决&#xff1a;升级高版本即可。

4.1 图标资源、光标资源

图标资源 添加资源 添加资源(可视化完成) 注意图标的大小&#xff0c;一个图标文件中&#xff0c;可以有多个不同大小的图标。加载 LoadIcon 是 Windows API 中用于加载图标资源的函数 HICON WINAPI LoadIcon(HINSTANCE hInstance,LPCTSTR lpIconName );参数说明 1.hInstanc…

牛客JS题(二十七)Getter

注释很详细&#xff0c;直接上代码 涉及知识点&#xff1a; class基础用法getter的应用setter的应用 题干&#xff1a; 我的答案 <!DOCTYPE html> <html><head><meta charsetutf-8></head><body><script type"text/javascript&qu…

机器人帮助文档

文章目录 机器交流使用群使用图例1. 查看机器人使用文档2. 直接问问题&#xff08;系统默认AI&#xff09;3. 系统默认AI切换4. 直接问问题&#xff08;指定讯飞星火AI&#xff09;5. 直接问问题&#xff08;指定百度文心AI&#xff09;6. 直接问问题&#xff08;指定谷歌AI&am…

Python的全局变量

我来举个例子 像下面&#xff0c;我把全局变量写在函数外面&#xff0c;导致func函数里得不到变量 正确做法应该是在函数内引入全局变量&#xff0c;利用global关键字 请注意&#xff01;由于1的操作导致全局变量发生改变&#xff0c;可能会影响到其他引用全局变量的地方。这点…

基于统计检验与机器学习研究客户对保险兴趣的因素

1.项目背景 保险单是一种安排&#xff0c;公司承诺为特定的损失、损坏、疾病或死亡提供赔偿保证&#xff0c;以换取支付指定的保费。保费是客户需要定期向保险公司支付的一笔钱&#xff0c;以提供此保证&#xff0c;与医疗保险一样&#xff0c;也有车辆保险&#xff0c;客户每…

【Python】requests获取网络响应的时候,遇到url超过最大重试次数的解决方法

我们在使用requests连接网址后&#xff0c;获取网络响应的时候&#xff0c;有时候可能会遇到这样的问题&#xff1a; 问题&#xff1a; Maxretries exceeded with url: /tags-%E9%A1%B9%E7%9B%AE-5.html(Caused by SSLError(SSLEOFError(8,‘EOFoccurred in violation of prot…

大模型层数过多影响

当层数过多时候&#xff0c;梯度是累乘关系&#xff0c;如100 最后可能超过f16精度 梯度爆炸 后面梯度和权重值特别大 梯度消失 后台梯度和权重趋近于0 梯度合理范围e-6 到 e3 优化方法 1、优化点 乘法改为加法 resnet lstm 2、归一 梯度归一&#xff0c;大于小于阈值…

防范 Active Directory 攻击

关注公众号网络研究观获取更多内容。 Active Directory (AD) 是组织 Windows 网络的核心&#xff0c;可默默协调用户访问、身份验证和安全性。 但您真的了解它的工作原理吗&#xff1f;本博客将揭开 AD 的层层面纱&#xff0c;揭示其核心组件以及它们如何实现集中控制。探索 …

【ARM CoreLink 系列 4.2 -- NIC-400 控制器详细介绍】

请阅读【ARM AMBA 总线 文章专栏导读】 文章目录 NIC-400 TopNIC-400 Terminology(术语介绍)AMBA Slave Interface BlockSwitchDefault SlaveInterface BlockGlobal Programmers ViewAMBA Master interface BlockNIC-400 GPV(Global Programmers View)NIC-400 SwitchNIC-400 …

为什么用代理IP访问不了网站?如何解决?

代理IP可以为用户在访问网站时提供更多的便利性和匿名性&#xff0c;但有时用户使用代理IP后可能会遇到无法访问目标网站的问题。这可能会导致用户无法完成所需的业务要求&#xff0c;给用户带来麻烦。使用代理IP时&#xff0c;您可能会因为各种原因而无法访问您的网站。下面小…

柏林噪声(Perlin Noise)

要获得看起来很酷的实心纹理&#xff0c;大多数人使用某种形式的Perlin噪声。Perlin噪声返回类似下图的噪声。 Perlin噪声的一个关键部分是它是可重复的&#xff1a;它接受一个3D点作为输入&#xff0c;并总是返回相同的随机数字。附近的点返回相似的数字。Perlin噪声的另一个重…