当前位置: 首页 > news >正文

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-延迟执行

函数对象的使用在框架中是十分常见的,例如我们常用日志框架

  • 根据不同的日志级别执行不同的日志输出

函数对象

在这里插入图片描述

使用函数对象,存储日志

在这里插入图片描述

http://www.lryc.cn/news/341446.html

相关文章:

  • 致远oa实时获取第三方自定义组件实现
  • 【Linux-点灯烧录-SD卡/USB烧写】
  • PostgreSQL自带的命令行工具06- pg_isready
  • 【请投票】嘉立创EDA中LED发光二极管是否应有统一的引脚定义?
  • LT6911UXB HDMI2.0 至四端口 MIPI DSI/CSI,带音频 龙迅方案
  • 网络培训议题@2
  • linux文本三剑客之sed
  • nginx封禁恶意IP
  • 「PHP系列」PHP MySQL 简介及运用
  • 深度学习论文: XFeat: Accelerated Features for Lightweight Image Matching
  • C++之Eigen库基本使用
  • 2024年 Java 面试八股文——SpringBoot篇
  • C/C++的指针、万能指针、常量指针和指针常量
  • 【讲解下如何解决一些常见的 Composer 错误】
  • qq空间:图片批量下载js脚本工具,javascript批量下载图片
  • 滑动验证码登陆测试编程示例
  • 爬取89ip代理、 爬取豆瓣电影
  • XBoot:基于Spring Boot 2.x的一站式前后端分离快速开发平台
  • 24年最新抖音、视频号0成本挂机,单号每天收益上百,可无限挂
  • Day31:单元测试、项目监控、项目部署、项目总结、常见面试题
  • Flutter笔记:使用Flutter私有类涉及的授权协议问题
  • 面试过程种遇到的面试题收集
  • Vue学习:21.mixins混入
  • 上传文件到 linux
  • NEO 学习之session7
  • 毕业设计uniapp+vue有机农产品商城系统 销售统计图 微信小程序
  • php使用Canal监听msyql
  • metabase部署与实践
  • nacos v2.2.3 docker简单安装使用
  • java设计模式-生成器模式