java-函数式编程-函数对象
定义
- 什么是合格的函数?
- 无论多少次执行函数,只要输入一样,输出就不会改变
对象方法的简写
其实在类中,我们很多参数中都有一个this,被隐藏传入了

函数也可以作为对象传递,lambda就是很好的例子
函数式接口中经常这么使用,定义方法名,具体的方法实现等待外界传入

示例
客户端有操作的函数
服务器端有数据
public class Client {// 操作在客户端interface MyLambda extends Serializable {int fun(int a, int b);}public static void main(String[] args) throws IOException {Socket socket = new Socket("127.0.0.1",8888);MyLambda lambda = (a, b) -> a + b;OutputStream outputStream = socket.getOutputStream();ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);objectOutputStream.writeObject(lambda);}
}
服务器端
public class Server {// 数据在服务器端public static void main(String[] args) throws IOException, ClassNotFoundException {ServerSocket serverSocket = new ServerSocket(8888);while(true){Socket socket = serverSocket.accept();InputStream inputStream = socket.getInputStream();ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);Client.MyLambda myLambda = (Client.MyLambda) objectInputStream.readObject();System.out.println(myLambda.fun(1,2));}}
}
函数对象优点1-行为参数化
操作的对象一直,但是操作的方式千千万,
- 我们可以将
共同的部分提取为一个方法- 将不同的操作的行为,将行为
作为参数传递给这个方法- 上述的操作的方式就是
行为参数化
过滤接口-定义过滤行为
/*** 学生过滤接口*/
interface StudentFilter {boolean test(Student student);
}
过滤器
/*** 过滤学生* @param students 学生列表* @param filter 过滤条件* @return 过滤后的学生列表*/
public static List<Student> filterStudent(List<Student> students, StudentFilter filter) {List<Student> list = new ArrayList<>();for (Student student : students) {if (filter.test(student)) {list.add(student);}}return list;
}
使用的时候传递行为即可
- 统一调用 filterStudent 方法
- 使用
lambda传递不同行为即可(当然也可以使用匿名内部类,不太简洁而已)
// 随机定义个Student列表
List<Student> students = List.of(new Student("张三", 18, "男"),new Student("李四", 19, "女"),new Student("王五", 20, "男"),new Student("赵六", 21, "女")
);
System.out.println("学生列表:");
students.forEach(System.out::println);// 过滤出年龄大于18的学生
List<Student> ageFilter = filterStudent(students, student -> student.getAge() > 18);
System.out.println("年龄大于18的学生:");
ageFilter.forEach(System.out::println);// 过滤出性别为男的学生
List<Student> genderFilter = filterStudent(students, student -> "男".equals(student.getGender()));
System.out.println("性别为男的学生:");
genderFilter.forEach(System.out::println);
函数对象优点2-延迟执行
函数对象的使用在框架中是十分常见的,例如我们常用日志框架
- 根据不同的日志级别执行不同的日志输出
函数对象

使用函数对象,存储日志

相关文章:
java-函数式编程-函数对象
定义 什么是合格的函数?无论多少次执行函数,只要输入一样,输出就不会改变 对象方法的简写 其实在类中,我们很多参数中都有一个this,被隐藏传入了 函数也可以作为对象传递,lambda就是很好的例子 函数式接口中…...
致远oa实时获取第三方自定义组件实现
背景 最近的一个需求不好处理,甲方没有准确的数据支撑,各种问题踢皮球,所以有时间实现一个实时获取数据的组件 需求 为了实现方便,封装了一个第三方数据实时展示的组件 只要修改配置,就可以实现字段的删除增加&…...
【Linux-点灯烧录-SD卡/USB烧写】
目录 1. 烧写方式2. 烧写之代码编译2.1 led.s->led.o2.2 led.o->led.elf2.3 led.elf->led.bin2.4 反汇编:led.elf->led.dis 3. 烧写之烧录到SD卡上:3.1 开启烧录软件权限:3.2 确定SD卡的格式:FAT323.3 烧录到SD卡上3.…...
PostgreSQL自带的命令行工具06- pg_isready
PostgreSQL自带的命令行工具06- pg_isready 基础信息 OS版本:Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本:16.2 pg软件目录:/home/pg16/soft pg数据目录:/home/pg16/data 端口:5777pg_isready 是 Po…...
【请投票】嘉立创EDA中LED发光二极管是否应有统一的引脚定义?
LED发光二极管的引脚定义应该是唯一的吗? 从下面原理图可以看到,器件型号仅尾缀不同,R代表RED红色发光二极管,W代表WHITE指白色发光二极管,是同一家制造商KENTO, 左侧红色发光二极管的1脚是阴极K,2脚是阳极…...
LT6911UXB HDMI2.0 至四端口 MIPI DSI/CSI,带音频 龙迅方案
1. 描述LT6911UXB 是一款高性能 HDMI2.0 至 MIPI DSI/CSI 转换器,适用于 VR、智能手机和显示应用。HDMI2.0 输入支持高达 6Gbps 的数据速率,可为4k60Hz视频提供足够的带宽。此外,数据解密还支持 HDCP2.2。对于 MIPI DSI / CSI 输出࿰…...
网络培训议题@2
目录 1. 如何通过IP和掩码确定网关:2. 网络路由的意义和配置方法:3. 网络Bond模式的区别和配置场景:4. 堆叠、VLAN、Trunk、聚合的意义:5. 虚拟机环境下VIP配置和常见问题:6. VXLAN拓展: 1. 如何通过IP和掩…...
linux文本三剑客之sed
目录 1、sed特点 1)sed命令格式 2)sed命令核心功能"增删改查" 2、sed命令执行过程 3、sed核心应用 1)sed-查找p 2)sed-删除d 3)sed-增加cai 4) sed-替换s 1、sed特点 sed stream editor 流编辑器…...
nginx封禁恶意IP
网络攻击时有发生 TCP洪水攻击、注入攻击、DOS等比较难防的有DDOS等 为了数据安全,防止对手爬虫恶意爬取,封禁IP 一般封禁ip linux server层面封IP:iptablesnginx层面封IP,方式多种(但req还是会打进来,让…...
「PHP系列」PHP MySQL 简介及运用
文章目录 一、PHP MySQL 简介二、MySQL安装三、相关链接 一、PHP MySQL 简介 PHP MySQL是一个结合了PHP和MySQL的组合,用于在Web应用程序中处理数据库操作。 MySQL: 定义:MySQL是一个流行的开源关系型数据库管理系统(RDBMS&…...
深度学习论文: XFeat: Accelerated Features for Lightweight Image Matching
深度学习论文: XFeat: Accelerated Features for Lightweight Image Matching XFeat: Accelerated Features for Lightweight Image Matching PDF: https://arxiv.org/pdf/2404.19174 PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代码: https://github.…...
C++之Eigen库基本使用
目录 1、矩阵的构造和初始化操作 2、矩阵的算术运算 3、矩阵的分解和求解 4、矩阵的变换 5、矩阵的访问和修改 6、矩阵遍历 7、线性方程组求解 8、其他操作 Eigen库是一个高级的C库,用于线性代数,矩阵和向量运算,数值分析和相关的数学…...
2024年 Java 面试八股文——SpringBoot篇
目录 1. 什么是 Spring Boot? 2. 为什么要用SpringBoot 3. SpringBoot与SpringCloud 区别 4. Spring Boot 有哪些优点? 5. Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的? 6. Spring Boot 支持哪些日志框架&#…...
C/C++的指针、万能指针、常量指针和指针常量
C/C的指针 1、 指针的概念: 指针是一个变量,它存储的是另一个变量的内存地址,而不是变量的值。 指针变量的声明:在C/C等语言中,我们通过使用星号*来声明一个指针变量。例如,int *ptr; 这行代码声明了一个…...
【讲解下如何解决一些常见的 Composer 错误】
🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…...
qq空间:图片批量下载js脚本工具,javascript批量下载图片
qq空间:图片批量下载js脚本工具,javascript批量下载图片 QQ空间很多老照片想下载,但是腾讯没放开,只能一张张下载太麻烦。用前端js写了一个脚本支持批量下载。另外就是空间内的照片会被压缩,过几年再看,个…...
滑动验证码登陆测试编程示例
一、背景及原理 处理登录时的滑动验证码有两个难点,第一个是找到滑块需要移动的距离,第二个是模拟人手工拖动的轨迹。模拟轨迹在要求不是很严的情况下可以用先加速再减速拖动的方法,即路程的前半段加速度为正值,后半段为负值去模…...
爬取89ip代理、 爬取豆瓣电影
1 爬取89ip代理 2 爬取豆瓣电影 1 爬取89ip代理 import requests from fake_useragent import UserAgent from bs4 import BeautifulSoup from requests.exceptions import ProxyErrorclass SpiderIP:def __init__(self):# 定义目标地址哦self.tag_url "https://www.89i…...
XBoot:基于Spring Boot 2.x的一站式前后端分离快速开发平台
XBoot:基于Spring Boot 2.x的一站式前后端分离快速开发平台 摘要 随着信息技术的迅速发展,快速构建高质量、高可靠性的企业级应用成为了迫切需求。XBoot,作为一个基于Spring Boot 2.x的一站式前后端分离快速开发平台,通过整合微信…...
24年最新抖音、视频号0成本挂机,单号每天收益上百,可无限挂
详情介绍 这次给大家带来5月份最新的短视频挂机项目,简单易上手,而且不需要任何投入,经过测试收益非常可观,软件完全免费,特别适合没有时间但是想做副业的家人们...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...
基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)
引言 在嵌入式系统中,用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例,介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单,执行相应操作,并提供平滑的滚动动画效果。 本文设计了一个…...
leetcode73-矩阵置零
leetcode 73 思路 记录 0 元素的位置:遍历整个矩阵,找出所有值为 0 的元素,并将它们的坐标记录在数组zeroPosition中置零操作:遍历记录的所有 0 元素位置,将每个位置对应的行和列的所有元素置为 0 具体步骤 初始化…...
轻量级Docker管理工具Docker Switchboard
简介 什么是 Docker Switchboard ? Docker Switchboard 是一个轻量级的 Web 应用程序,用于管理 Docker 容器。它提供了一个干净、用户友好的界面来启动、停止和监控主机上运行的容器,使其成为本地开发、家庭实验室或小型服务器设置的理想选择…...
未授权访问事件频发,我们应当如何应对?
在当下,数据已成为企业和组织的核心资产,是推动业务发展、决策制定以及创新的关键驱动力。然而,未授权访问这一隐匿的安全威胁,正如同高悬的达摩克利斯之剑,时刻威胁着数据的安全,一旦触发,便可…...
