java8函数式接口(函数式接口的匿名实现类作为某些方法的入参)

news2025/5/29 9:14:07

文章目录

  • 前置介绍
  • 通过 lambda 表达式,使用匿名类,实现函数式接口
  • 函数式接口和回调函数的关系
  • 函数式接口的应用

前置介绍

是 Java 8 引入的核心概念之一,指的是 仅包含一个抽象方法的接口。它可以被 @FunctionalInterface 注解标记(可选),但即使不标记,只要满足“只有一个抽象方法”的条件,编译器也会将其视为函数式接口

函数式接口可以作为 Lambda 表达式的目标类型

往往通过 lambda 表达式的写法,使用一个匿名类,来实现一个函数接口

通过 lambda 表达式,使用匿名类,实现函数式接口

在 Java 8 之前,实现一个函数式接口需要通过匿名内部类

// 传统方式:匿名内部类
Runnable r = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello from thread");
    }
};

Java 8 引入后,实现一个函数式接口可以通过 Lambda 表达式简化代码来表示一个匿名的实现类

函数式接口的匿名实现

这种 lambda 表示表示,它是一个匿名类,实现了函数式接口,同时这个匿名实现类中实现的这个方法没有传参,被实现的方法内执行的是一个 sout 的操作

// 使用 Lambda 表达式
Runnable r = () -> System.out.println("Hello from thread");

函数式接口和回调函数的关系

函数式接口的匿名实现类,往往作为某个方法的参数传递过去,这个函数式接口的匿名实现类其实可以看作一个“回调函数”,虽然其是一个匿名实现“类”,但是起到了回调函数的作用,因为可以通过用不同的匿名类实现函数式接口中的唯一那个方法,实现该方法的写法不同,就可以看成“回调函数”的能力了

@FunctionalInterface
interface MyFunction {
    int apply(int a, int b);
}

public class Main {
    public static void main(String[] args) {
        MyFunction add = (a, b) -> a + b;
        System.out.println(add.apply(3, 4)); // 输出 7
        
		MyFunction sub = (a, b) -> a - b;
        System.out.println(sub.apply(3, 4)); // 输出 -1
    }
}

函数式接口的应用

很常见的场景就是 java 的流式处理中 lambda 表达式

List<String> names = Arrays.asList("Apple", "Banana", "Cherry");

// 过滤长度大于5的字符串
List<String> result = names.stream()
    .filter(Predicate.isEqual("Apple")) // 等于某个值
    .collect(Collectors.toList());
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
// 将数字转换为平方值
List<Integer> squares = numbers.stream()
    .map(x -> x * x)
    .collect(Collectors.toList());
List<String> names = Arrays.asList("Alice", "Bob");
// 打印所有名字
names.forEach(name -> System.out.println(name));

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

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

相关文章

鸿蒙仓颉开发语言实战教程:实现商城应用详情页

昨天有朋友提到鸿蒙既然有了ArkTs开发语言&#xff0c;为什么还需要仓颉开发语言。其实这个不难理解&#xff0c;安卓有Java和Kotlin&#xff0c;iOS先后推出了Objective-C和Swift&#xff0c;鸿蒙有两种开发语言也就不奇怪了。而且仓颉是比ArkTs更加灵活的语言&#xff0c;虽然…

GitAny - 無需登入的 GitHub 最新倉庫檢索工具

地址&#xff1a;https://github.com/MartinxMax/gitany GitAny - 無需登入的 GitHub 專案搜尋工具 GitAny 是一款基於 Python 的工具&#xff0c;允許你在無需登入的情況下搜尋當天最新的 GitHub 專案。它支援模糊搜尋、條件篩選以及倉庫資料的視覺化分析。 安裝依賴 $ pip…

在飞牛nas系统上部署gitlab

在飞牛nas系统上部署gitlab需要使用docker进行部署&#xff0c;如下将介绍详细的部署流程。 文章目录 1. docker镜像2. 拉取镜像3. 运行容器4. 运行和访问gitlab5. 一些小配置5.1 url问题5.2 ssh端口5.3 其他配置 1. docker镜像 首先需要找一个gitlab的docker镜像地址&#x…

深入理解 Redis 哨兵模式

Redis 哨兵模式深度解析&#xff1a;从原理到实践的全流程指南 在分布式系统架构中&#xff0c;Redis 作为高性能的内存数据库&#xff0c;其哨兵模式&#xff08;Sentinel&#xff09;是保障服务高可用性的核心方案。本文将从基础概念、运行机制出发&#xff0c;结合具体配置…

[特殊字符]《Qt实战:基于QCustomPlot的装药燃面动态曲线绘制(附右键菜单/样式美化/完整源码)》

1、将qcustomplot.cpp qcustomplot.h放入工程目录下引入qcustomplot 2、代码 .h #if defined(_MSC_VER) #pragma execution_character_set(

力扣-最大连续一的个数

1.题目描述 2.题目链接 1004. 最大连续1的个数 III - 力扣&#xff08;LeetCode&#xff09; 3.代码解答 class Solution {public int longestOnes(int[] nums, int k) {int zero0,length0;for(int left0,right0;right<nums.length;right){if(nums[right]0){zero;}while…

无人机避障——深蓝学院浙大栅格地图以及ESDF地图内容

Occupancy Grid Map & Euclidean Signed Distance Field: 【注意】&#xff1a;目的是为了将有噪声的传感器收集起来&#xff0c;用于实时的建图。 Occupancy Grid Map&#xff1a; 概率栅格&#xff1a; 【注意】&#xff1a;由于传感器带有噪声&#xff0c;在实际中基于…

Postman基础操作

1.Postman是什么&#xff1f; Postman是接口测试的工具&#xff0c;简单来说它能模拟浏览器对服务器的某个接口发起请求并接收响应数据。 1.1 Postman工作原理 2.Postman发送请求 2.1 发送GET请求 我们知道GET请求是没用请求体的&#xff0c;所以我们需要将请求参数写在Param…

【MPC控制 - 从ACC到自动驾驶】3 MPC控制器设计原理与参数配置:打造ACC的“最强大脑”

【MPC控制 - 从ACC到自动驾驶】MPC控制器设计原理与参数配置&#xff1a;打造ACC的“最强大脑” 在Day 1&#xff0c;我们认识了ACC自适应巡航和MPC这位“深谋远虑的棋手”。Day 2&#xff0c;我们一起给汽车“画像”&#xff0c;建立了它的纵向动力学模型&#xff0c;并把它翻…

Unity3D仿星露谷物语开发52之菜单页面

1、目标 创建菜单页面&#xff0c;可通过Esc键开启或关闭。 当把鼠标悬停在上面时它会高亮&#xff0c;然后当点击按钮时标签页会被选择。 2、 创建PauseMenuCanvas &#xff08;1&#xff09;创建Canvas 在Hierarchy -> PersistentScene -> UI下创建新的Cavans命名为…

MySQL——复合查询表的内外连

目录 复合查询 回顾基本查询 多表查询 自连接 子查询 where 字句中使用子查询 单行子查询 多行子查询 多列子查询 from 字句中使用子查询 合并查询 实战OJ 查找所有员工入职时候的薪水情况 获取所有非manager的员工emp_no 获取所有员工当前的manager 表的内外…

小米玄戒O1架构深度解析(一):十核异构设计与缓存层次详解

前言 这两天&#xff0c;小米的全新SOC玄戒O1横空出世&#xff0c;引发了科技数码圈的一次小地震&#xff0c;那么小米的这颗所谓的自研SOC&#xff0c;内部究竟有着什么不为人知的秘密呢&#xff1f;我们一起一探究竟。 目录 前言1 架构总览1.1 基本构成1.2 SLC缺席的原因探…

[免费]微信小程序宠物医院管理系统(uni-app+SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序宠物医院管理系统(uni-appSpringBoot后端Vue管理端)&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序宠物医院管理系统(uni-appSpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibi…

ETL 工具与数据中台的关系与区别

ETL 工具和数据中台作为数据处理领域的关键概念&#xff0c;虽然存在一定的关联&#xff0c;但二者有着明显的区别。本文将深入剖析 ETL 工具与数据中台之不同。 一、ETL 工具概述 ETL 是数据仓库技术中的核心技术之一&#xff0c;其全称为 Extract&#xff08;抽取&#xff…

SQLMesh Typed Macros:让SQL宏更强大、更安全、更易维护

在SQL开发中&#xff0c;宏&#xff08;Macros&#xff09;是一种强大的工具&#xff0c;可以封装重复逻辑&#xff0c;提高代码复用性。然而&#xff0c;传统的SQL宏往往缺乏类型安全&#xff0c;容易导致运行时错误&#xff0c;且难以维护。SQLMesh 引入了 Typed Macros&…

Docker 使用镜像[SpringBoot之Docker实战系列] - 第537篇

历史文章&#xff08;文章累计530&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 《…

解锁MCP:AI大模型的万能工具箱

摘要&#xff1a;MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;是由Anthropic开源发布的一项技术&#xff0c;旨在作为AI大模型与外部数据和工具之间沟通的“通用语言”。它通过标准化协议&#xff0c;让大模型能够自动调用外部工具完成任务&a…

Error in beforeDestroy hook: “Error: [ElementForm]unpected width “

使用 element 的 form 时候报错&#xff1a; vue.runtime.esm.js:3065 Error: [ElementForm]unpected width at VueComponent.getLabelWidthIndex (element-ui.common.js:23268:1) at VueComponent.deregisterLabelWidth (element-ui.common.js:23281:1) at Vue…

私有知识库 Coco AI 实战(七):摄入本地 PDF 文件

是否有些本地文件要检索&#xff1f;没问题。我们先对 PDF 类的文件进行处理&#xff0c;其他的文件往后稍。 Coco Server Token 创建一个 token 备用。 PDF_Reader 直接写个 python 程序解析 PDF 内容&#xff0c;上传到 Coco Server 就行了。还记得以前都是直接写入 Coco …

【Unity3D】将自动生成的脚本包含到C#工程文件中

我们知道&#xff0c;在用C#开发中&#xff0c;通过vs编辑器新建的脚本&#xff0c;会自动包含到vs工程中&#xff0c;而通过外部创建&#xff0c;比如复制别的工程或代码创建的C#脚本不会包含到vs工程。 在我们的日常开发中&#xff0c;通常会自动创建C#脚本&#xff0c;特别…