函数式接口:Java 中的函数式编程利器

news2024/9/30 11:40:16

文章目录

    • 1. 函数式接口概念
    • 2. 注解
    • 3. 自定义函数式接口
    • 4. 函数式编程
      • 4.1 Lambda的延迟执行效果
      • 4.2 使用Lambda作为参数和返回值
        • 作为参数使用
        • 作为返回值使用
    • 5. 常用的函数接口
      • 5.1 `Supplier`:生产者
      • 5.2 `Consumer`:消费者
      • 5.3 `Predicate`:判断
      • 5.4 `Function`:转换函数
    • 结论

在这里插入图片描述

🎉欢迎来到Java学习路线专栏~探索函数式接口:Java 中的函数式编程利器


  • ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹
  • ✨博客主页:IT·陈寒的博客
  • 🎈该系列文章专栏:Java学习路线
  • 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习
  • 🍹文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • 📜 欢迎大家关注! ❤️

在现代编程语言中,函数式编程正变得越来越重要。Java 8引入了函数式编程的支持,其中的函数式接口是实现函数式编程的基石。本文将深入探讨函数式接口的概念、注解、自定义、以及常用的函数接口,以帮助您更好地理解和应用这一强大的编程范式。
在这里插入图片描述

1. 函数式接口概念

在理解函数式接口之前,我们首先需要了解什么是接口。在Java中,接口是一种抽象类型,可以包含抽象方法、默认方法、静态方法等成员。通常,接口用于定义某一类对象应该具有的方法签名,而具体的类则实现这些接口并提供相应的方法实现。

在这里插入图片描述

而函数式接口是一种特殊的接口,它只能包含一个抽象方法。这个抽象方法通常表示一个函数,可以用作Lambda表达式或方法引用的目标。函数式接口是函数式编程的基础,它允许我们将函数当作一等公民来传递和操作。
在这里插入图片描述

2. 注解

在Java中,注解是一种用于为代码提供元数据的方式。@FunctionalInterface注解是函数式接口的标志,它用于告诉编译器这个接口应该被视为函数式接口。如果一个接口被标记为@FunctionalInterface,但包含多于一个抽象方法,编译器将会报错。

在这里插入图片描述

下面是一个使用@FunctionalInterface注解的示例:

@FunctionalInterface
interface MyFunction {
    int apply(int x, int y);
}

这个接口定义了一个名为apply的抽象方法,表示一个接收两个整数参数并返回整数结果的函数。

3. 自定义函数式接口

有时候,您可能需要定义自己的函数式接口以满足特定的需求。典型的使用场景是将函数式接口作为方法的参数传递。以下是一个自定义函数式接口的示例:

@FunctionalInterface
interface MyStringFunction {
    String manipulate(String input);
}

这个自定义的函数式接口MyStringFunction定义了一个名为manipulate的抽象方法,表示一个接收一个字符串参数并返回一个字符串结果的函数。
在这里插入图片描述
在这里插入图片描述

4. 函数式编程

4.1 Lambda的延迟执行效果

函数式编程的一个关键特点是Lambda表达式的延迟执行效果。通常,普通方法的实现逻辑在方法内部已经定义,而在方法调用时逻辑已经完全确定。但基于函数式接口的使用,方法的逻辑直到使用时才进行定义,这实际上是一种逻辑的后置执行,达到了延迟效果。
在这里插入图片描述

下面是一个Lambda延迟执行的示例:

public static void main(String[] args) {
    Runnable task = () -> System.out.println("Hello, world");
    // 在这里,Lambda表达式的逻辑并没有立即执行
    // 只有在下面的线程启动后才会执行
    Thread thread = new Thread(task);
    thread.start();
}

4.2 使用Lambda作为参数和返回值

Lambda表达式在函数式编程中常用作参数和返回值,这通常涉及到函数式接口的使用。下面是两个示例:

作为参数使用

public static void main(String[] args) {
    Thread thread = getThread(() -> System.out.println("Hello, world"));
    thread.start();
}

public static Thread getThread(Runnable task) {
    return new Thread(task);
}

在这个示例中,getThread方法接受一个Runnable类型的参数,然后使用Lambda表达式作为参数传递给该方法。

作为返回值使用

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("abc");
    list.add("ab");
    list.add("abcde");
    list.add("abcd");
    list.add("a");

    System.out.println(list);
    Collections.sort(list, stringComparator());
    System.out.println(list);
}

public static Comparator<String> stringComparator() {
    return (s1, s2) -> s2.length() - s1.length();
}

在这个示例中,stringComparator方法返回一个Comparator类型的对象,该对象的compare方法由Lambda表达式定义。这使得我们可以根据字符串的长度进行降序排序。

5. 常用的函数接口

Java标准库中提供了一些常用的函数式接口,它们涵盖了各种常见的函数操作。以下是一些常用的函数接口及其用途:

5.1 Supplier:生产者

Supplier是一种生产者函数式接口,它用于获取元素。它定义了一个get方法,该方法不接受任何参数并返回一个值。常用于延迟加载或需要多次生成值的场景。

Supplier<String> supplier = () -> "Hello, world";
String value = supplier.get(); // 获取元素

5.2 Consumer:消费者

Consumer是一种消费者函数式接口,它用于消费值但不返回任何结果。它定义了一个accept方法,该方法接受一个值作为参数并执行相应的操作。

Consumer<String> consumer = s -> System.out.println("Consumed: " + s);
consumer.accept("Hello, world"); // 消费值并打印

Consumer还提供了andThen方法,用于串联多个Consumer,使它们按顺序执行。

Consumer<String> first = s -> System.out.println("First: " + s);
Consumer<String> second = s -> System.out.println("Second: " + s);

Consumer<String> combined = first.andThen(second);
combined.accept("Hello, world"); // 依次执行两个Consumer

5.3 Predicate:判断

Predicate是一种判断函数式接口,它用于测试一个值是否满足特定条件。它定义了一个test方法,该方法接受一个值并返回一个布尔值。

Predicate<String> predicate = s -> s.length() > 2;
boolean result = predicate.test("Hello"); // 判断字符串长度是否大于2

Predicate还提供了一系列默认方法,如andornegate,用于组合多个Predicate

Predicate<String> lengthPredicate = s -> s.length() > 2;
Predicate<String> containsAPredicate = s -> s.contains("a");

Predicate<String> combined = lengthPredicate.and(containsAPredicate); // 与操作
boolean result = combined.test("Apple"); // 判断字符串长度大于2且包含字母"a"

5.4 Function:转换函数

Function是一种转换函数式接口,它用于将一个类型的值转换为另一个类型的值。它定义了一个apply方法,该方法接受一个值并返回另一个值。

Function<String, Integer> function = s -> s.length();
int length = function.apply("Hello"); // 将字符串长度转换为整数

Function还提供了andThen方法,用于串联多个Function,使它们依次执行。

Function<String, Integer> lengthFunction = s -> s.length();
Function<Integer, String> formatFunction = n -> "Length: " + n;

Function<String, String> combined = lengthFunction.andThen(formatFunction);
String result = combined.apply("Hello"); // 先获取长度,再格式化

结论

函数式接口是Java函数式编程的基础,它们允许我们以更简洁和灵活的方式处理函数操作。通过了解函数式接口的概念、注解、自定义和常用函数接口,您可以更好地应用函数式编程的思想,并编写出更具表达力和可读性的代码。函数式编程已经成为现代软件开发中不可或缺的一部分,掌握它将使您更具竞争力和创造力。


🧸结尾 ❤️ 感谢您的支持和鼓励! 😊🙏
📜您可能感兴趣的内容:

  • 【Java面试技巧】Java面试八股文 - 掌握面试必备知识(目录篇)
  • 【Java学习路线】2023年完整版Java学习路线图
  • 【AIGC人工智能】Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
  • 【Java实战项目】SpringBoot+SSM实战:打造高效便捷的企业级Java外卖订购系统
  • 【数据结构学习】从零起步:学习数据结构的完整路径

在这里插入图片描述

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

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

相关文章

深度学习模型的泛化性

暂时无法在飞书文档外展示此内容 零、泛化性 泛化性指模型经过训练后&#xff0c;应用到新数据并做出准确预测的能力。一个模型在训练数据上经常被训练得太好即过拟合&#xff0c;以致无法泛化。 深度学习模型过拟合的原因&#xff0c;不仅仅是数据原因&#xff1a; 模型复…

云原生Kubernetes:CRI 容器运行时接口

目录 一、理论 1.​CRI 2.容器运行时层级 3.容器运行时比较 二、总结 一、理论 1.​CRI &#xff08;1&#xff09;概念 Kubernetes Node (kubelet) 的主要功能就是启动和停止容器的组件&#xff0c;我们 称之为容器运行时&#xff08; Container Runtime) &#xff0c;…

ChatGPT新增超强插件:文本直接生成视频、海报,支持自定义修改!

全球著名在线设计平台Canva&#xff0c;在ChatGPT Plus&#xff08;GPT-4&#xff09;上推出了插件功能&#xff0c;用户通过文本提示&#xff0c;几秒钟就能生成演示文稿、PPT插图、电子书封面、宴会邀请函等各种精美设计海报&#xff0c;同时支持生成视频。 该插件最强大的功…

虚函数、纯虚函数、多态

一.虚函数 在基类的函数前加上virtual关键字&#xff0c;在派生类中重写该函数&#xff0c;运行时将会根据所指对象的实际类型来调用相应的函数&#xff0c;如果对象类型是派生类&#xff0c;就调用派生类的函数&#xff0c;如果对象类型是基类&#xff0c;就调用基类的函数。 …

FPGA通信—千兆网(UDP)软件设计

一、PHY引脚功能描述 电路设计使用RTL8211EG&#xff0c; 硬件设计、焊接正常用网线链接电脑和电路板&#xff0c;看到本地链接的1Gbps&#xff0c;代表设备网卡正常工作。

从零开始,无需公网IP,搭建本地电脑上的个人博客网站并发布到公网

文章目录 前言1. 安装套件软件2. 创建网页运行环境 指定网页输出的端口号3. 让WordPress在所需环境中安装并运行 生成网页4. “装修”个人网站5. 将位于本地电脑上的网页发布到公共互联网上 前言 在现代社会&#xff0c;网络已经成为我们生活离不开的必需品&#xff0c;而纷繁…

phpstudy本地快速搭建网站,并外网访问【无公网IP】

文章目录 使用工具1. 本地搭建web网站1.1 下载phpstudy后解压并安装1.2 打开默认站点&#xff0c;测试1.3 下载静态演示站点1.4 打开站点根目录1.5 复制演示站点到站网根目录1.6 在浏览器中&#xff0c;查看演示效果。 2. 将本地web网站发布到公网2.1 安装cpolar内网穿透2.2 映…

网络编程套接字,Linux下实现echo服务器和客户端

目录 1、一些网络中的名词 1.1 IP地址 1.2 端口号port 1.3 "端口号" 和 "进程ID" 1.4 初始TCP协议 1.5 UDP协议 2、socket编程接口 2.1 socket 常见API 2.2 sockaddr结构 3、简单的网络程序 3.1 udp实现echo服务器和客户端 3.1.1 echo服务器实…

Python 如何使用 csv、openpyxl 库进行读写 Excel 文件详细教程(更新中)

csv 基本概述 首先介绍下 csv (comma separated values)&#xff0c;即逗号分隔值&#xff08;也称字符分隔值&#xff0c;因为分隔符可以不是逗号&#xff09;&#xff0c;是一种常用的文本格式&#xff0c;用以存储表格数据&#xff0c;包括数字或者字符。 程序在处理数据时…

《机器人学一(Robotics(1))》_台大林沛群 第 6 周 【轨迹规划_直线转折处抛物线平滑】Quiz 6

步骤&#xff1a; 1、 编程 将PPT 的例子 跑一遍&#xff0c; 确保代码无误 2、根据题目 修改 相关参数 文章目录 求解代码_Python 解决的问题&#xff1a; 线段间转折点 的 速度 不连续 解决方法&#xff1a; 将直线段 两端 修正为 二次方程式 二次项圆滑 求解代码_Python …

图床项目性能测试

文章目录 一、FastDFS文件性能测试1.1 上传文件测试1.2 下载测试1.3 删除文件测试1.4 如何提高 二、图床项目wrklua性能测试2.1 wrk2.2 MySQL索引优化2.2 注册测试2.2.1 无索引性能2.2.2 有索引性能 2.3 登录测试2.3.1 无索引性能2.3.2 有索引性能 2.4 读取文件测试2.4.1 无索引…

ctfshow-web-新年好?

0x00 前言 CTF 加解密合集CTF Web合集网络安全知识库 文中工具皆可关注 皓月当空w 公众号 发送关键字 工具 获取 0x01 题目 0x02 Write Up 尝试访问之后返回了源码。可以看到重点是在setTimeout 首先来看setTimeout&#xff0c;setTimeout的意思就是说在一段时间后执行指定…

H5页面,上下滑动翻页(整页翻书切换效果)

使用 H5页面&#xff0c;上下滑动翻页 修改 页面间的切换&#xff1a;整页翻书的切换效果 demo代码&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <meta http-equiv"X-UA-Compatible" content"IEe…

突破传统显示技术,探索OLED透明屏的亮度革命

OLED透明屏作为未来显示技术的颠覆者&#xff0c;其亮度性能成为其引人注目的特点之一。 那么&#xff0c;今天尼伽便深入探讨OLED透明屏的亮度&#xff0c;通过引用数据、报告和行业动态&#xff0c;为读者提供高可读性和专业性强的SEO软文&#xff0c;增加可信度和说服力。 …

计算机丢失mfc140.dll怎么办,分享几种常见解决方案[dll修复工具下载】

一、mfc140.dll 的详细介绍 1.mfc140.dll 的作用 MFC140.dll 是 MFC 的一个组件&#xff0c;它提供了许多用于创建 Windows 应用程序的类和函数&#xff0c;如窗口管理、控件、对话框、菜单、消息处理等。这些类和函数可以帮助开发者更轻松地开发图形用户界面&#xff08;GUI&a…

【Linux】shell脚本和bat脚本:

文章目录 一、脚本对应环境&#xff1a;【1】shell&#xff1a;linux环境&#xff1b;后缀名为.sh【2】bat&#xff1a;windows环境&#xff1b;后缀名为.bat或者.cmd 二、脚本执行&#xff1a;【1】shell执行【2】bat脚本执行 三、脚本相关命令&#xff1a;1. shell命令【1】s…

【UE】材质描边、外发光、轮廓线

原教学视频链接&#xff1a; ue4 材质描边、外发光、轮廓线_哔哩哔哩_bilibili 步骤 1. 首先新建一个材质&#xff0c;这里命名为“Mat_outLine” 在此基础上创建一个材质实例 2. 在视口中添加一个后期处理体积 设置后期处理体积为无限范围 点击添加一个数组 选择“资产引用”…

如何将JACOCO应用到企业实战中~测试过招,只需6点

1、下载 jacoco 官网&#xff1a;https://www.jacoco.org/jacoco/index.html 如果你想学习自动化测试&#xff0c;我这边给你推荐一套视频&#xff0c;这个视频可以说是B站播放全网第一的自动化测试教程&#xff0c;同时在线人数到达1000人&#xff0c;并且还有笔记可以领取及…

Win10右键 nvidia rtx desktop manager 怎么删除(最新)

在更新了最新的 nvidia后原来的隐藏鼠标右键菜单后不行了&#xff0c;新方法如下&#xff1a; 步骤一&#xff1a;在键盘“WINR”键同时操作下&#xff0c;启动运行框&#xff0c;在框内输入“regedit”&#xff0c;打开深度系统win7 的注册表编辑器。 步骤二&#xff1a;为防…

Spring学习|Bean的作用域、自动装配Bean、注解实现自动装配、Spring注解开发

Bean的作用域 单例模式(Spring默认机制) 原型模式:每次从容器中get的时候&#xff0c;都会产生一个新对象! Bean的自动装配 自动装配是Spring满足bean依赖一种方式! Spring会在上下文中自动寻找&#xff0c;并自动给bean装配属性! 在Spring中有三种装配的方式 1.在xml中显示的…