函数编程之Function

news2024/11/13 13:02:15

文章目录

  • 前言
  • 一、Function是什么?
  • 二、Function 怎么用?
    • 1.简单使用
    • 2.真正的强大之处
  • 总结


前言

在java8之后,我已经习惯了开始用stream()方式编程,但是对于新引入的其他功能,还是不清楚,今天经历了一个编程问题后,让我对于Function() 这个函数有了新的认知;


一、Function是什么?

Function源码
从图中可以看到,Function是一个接口,而且仅仅有一个抽象方法,所以称之为函数式接口,在java8之后,所有的函数式接口都可以使用lambda 表达式去调用;
简单解读下:

  • Function是一个接口,所以我们使用的时候也就是实现这个接口
  • 可以看到apply这个抽象方法,入参是T 出参是R
  • 所以也就是实现这个apply方法,可以理解这个方法为类型的转换
  • Function函数有三个主要的方法:apply、compose、andThen
    apply:该方法意义是执行当前函数的方法体。
    compose(before):先执行before函数方法体,使用其返回参数,再执行调用者函数的方法体。
    andThen(after):先执行调用者方法,将其返回值作为参数调用after函数方法体。

二、Function 怎么用?

1.简单使用

Function<Integer,Integer> multi= (a) -> a * 100 ;
Function<Integer,Integer> add = (a) -> a.intValue() + 10;
// 执行multi函数的方法体 1*100=100
System.out.println(multi.apply(1));
// 先执行add函数方法体 1+ 10 ,然后将其返回值11作为参数执行mutli的方法体,返回1100
System.out.println(multi.compose(add).apply(1));
// 先执行multi函数方法体 1*100,然后将其返回值100作为参数执行add的方法体,返回100
System.out.println(multi.andThen(add).apply(1));

是的,没错,就很离谱 Function<Integer,Integer> multi= (a) -> a * 100 ; 这就是在定义这个function的具体执行内容,而真正调用这个function的是apply;

2.真正的强大之处

  • 今天遇到了一个问题,就是需要在一个类中,需要调用jdbc 的 接口去作查询(userService)
    不知道小伙伴的平时开发中是否遇到此类场景,那么我相信在没有function出现的时候,我们一般是这样处理的

第一种: 提前查询好所有数据,然后传入进去,循环比对找出想要的数据,然后处理
第二种: 将jdbc的接口传入,然后通过jvm加载到这个类,然后再调用这个类中的方法

那么,当我们有了function可以如何使用呢???

我现在有一个工具类


public class BeanFrom{
	// 第一个属性 定义一个函数 作用是想通过id 找到数据库中的用户信息
	private final Function<String, User> userFunction;
	// 第二个属性 课程信息(终点是包含用户id)
	private final Course course;

	public getUser(){
		// 这是调用处,相当于通过用户id从数据库中获取到了用户信息
		User user = userFunction.apply(course.getUserId());
	}
	public SqlFrom(Course course,Function<String, User> userFunction) {
        this.course= course;
        this.userFunction= userFunction;
    }
}

那么如何使用这个工具类呢?

@Autowired
UserService userService;

BeanFrom beanFrom = new BeanFrom (course,id-> userService.queryById(id));

那么经过此番操作,实现了什么,优势是什么?

  • 我实现了在普通的java类中,执行service的诉求
  • 我没有将service传入到工具类中,完美实现了解耦

总结

此次通过解决项目中的实际问题,记录下,对于function函数的使用有了更进一步的了解,也希望能读到此文章的小伙伴能收益,文章很浅显,希望大佬不吝赐教

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

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

相关文章

渲染农场优势是什么_云渲染农场怎么用?

在回答渲染农场的优势这个问题之前&#xff0c;我先申明一下本文中提到的渲染农场/云渲染平台/云渲染农场&#xff0c;都特指CG领域内的专业3D渲染平台&#xff0c;有一些文章会强调这个叫法的区别&#xff0c;但是业内一般都不会分这么细&#xff0c;所以也就不赘述了。渲染农…

【Spark分布式内存计算框架——Spark SQL】7. 数据处理分析案例

4.3 案例&#xff1a;电影评分数据分析 使用电影评分数据进行数据分析&#xff0c;分别使用DSL编程和SQL编程&#xff0c;熟悉数据处理函数及SQL使用&#xff0c;业务需求说明&#xff1a; 对电影评分数据进行统计分析&#xff0c;获取Top10电影&#xff08;电影评分平均值最高…

4道数学题,求解极狐GitLab CI 流水线|第23题:父子流水线 + 多项目流水线

本文来自&#xff1a; 武让 极狐(GitLab) 高级解决方案架构师 &#x1f4a1; 极狐GitLab CI 依靠其一体化、轻量化、声明式、开箱即用的特性&#xff0c;在开发者群体中的使用率越来越高&#xff0c;在国内企业中仅次于 Jenkins &#xff0c;排在第二位。 极狐GitLab 流水线有…

如何解决错误“已超过了锁请求超时时段。 (Microsoft SQL Server,错误: 1222)“

解决 Microsoft SQL Server 的错误: 1222 使用存储过程 sp_who2设置 LOCK_TIMEOUT在Microsoft SQL Server Management Studio中,有时会在对象资源管理器中查看树、表或过程时收到错误。当查询等待的时间超过锁定超时设置时,通常会发生此错误。锁定超时以毫秒为单位,等待后端…

LeetCode 382. 链表随机节点

原题链接 难度&#xff1a;middle\color{orange}{middle}middle 题目描述 给你一个单链表&#xff0c;随机选择链表的一个节点&#xff0c;并返回相应的节点值。每个节点 被选中的概率一样 。 实现 SolutionSolutionSolution 类&#xff1a; Solution(ListNodehead)Solution…

数据库(第五次作业)

1.1 Redis概述 1.1.1 什么是Redis 2008年&#xff0c;意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG&#xff0c;然而没过多久该公司的创始人 Salvatore Sanfilippo便开始对MySQL的性能感到失望&#xff0c;于是他决定亲自为LLOOGG量身定做一个数据…

Amazon S3简介

前言&#xff1a; 这段时间来到了某大数据平台&#xff0c;做平台技术底座封装和一些架构等等&#xff0c;有结构化数据也有非结构数据&#xff0c;涉及到很多技术&#xff0c;自己也私下花时间去研究了很多&#xff0c;有很多纯技术类的还是需要梳理并记录&#xff0c;巩固以及…

保姆级教程:Win10远程连接MACBook、MACBook远程连接Win10。

本篇给大家展示Windows远程连接连接MACBook、MACBook远程连接Windows的方法。需要明确的是&#xff0c;这种通过TCP远程连接的远程很稳定&#xff0c;基本比向日葵等软件流畅很多&#xff0c;但是缺点是需要保证在同一网域下&#xff0c;也就是同一局域网下&#xff0c;部分情况…

中国协同办公的终局是什么?

换言之&#xff0c;工具一体化是基本要求&#xff0c;但基于全链路集成的生态则是因地制宜、于当下的产业探索。 作者|斗斗 编辑|皮爷 出品|产业家 “计划裁员1300人&#xff0c;占到全球员工的15%。”美国东部时间2月7日&#xff0c;Zoom CEO袁征在官网博客发布公开信…

【SpringBoot】分布式日志跟踪—通过MDC实现全链路调用日志跟踪

一.MDC 1.MDC介绍 MDC&#xff08;Mapped Diagnostic Context&#xff0c;映射调试上下文&#xff09;是 log4j 和 logback 提供的一种方便在多线程场景下记录日志的功能。MDC 可以看成是一个与当前线程绑定的Map&#xff0c;可以往其中添加键值对。MDC 中包含的内容可以被同…

Python机器学习入门笔记(2)—— 分类算法

目录 转换器&#xff08;transformer&#xff09;和估计器&#xff08;estimator&#xff09; K-近邻&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09;算法 模型选择与调优 交叉验证&#xff08;Cross-validation&#xff09; GridSearchCV API 朴素贝叶…

UE4 渲染学习笔记(未完)

原文链接&#xff1a;虚幻4渲染管线入门 - 知乎 从原文摘抄一下&#xff1a; 渲染框架 1&#xff0c;一套是传统的以RHICmdList为核心构建RenderPass&#xff0c;从RHICmdList.BeginRenderPass(...)开始&#xff0c;以RHICmdList.EndRenderPass()结束的框架。 2.一套是以新的Gr…

【面向对象语言三大特性之 “继承”】

目录 1.继承的概念及定义 1.1继承的概念 1.2 继承定义 1.2.1定义格式 1.2.2继承关系和访问限定符 1.2.3继承基类成员访问方式的变化 2.基类和派生类对象赋值转换 3.继承中的作用域 4.派生类的默认成员函数 5.继承与友元 6. 继承与静态成员 7.复杂的菱形继承及菱形虚拟…

linux(全志)初始环境到移植lvgl

一、 格式化TF卡 1. linux命令行格式化 1.1 找到U盘位置&#xff08;已挂载&#xff09; sudo fdisk -l 如图&#xff0c;我的在/dev/sdb 1.2 格式化U盘 sudo mkfs -t vfat /dev/sdb-t 后面是格式化为哪种文件系统格式&#xff0c;vfat就是fat32格式&#xff0c;最后…

Hashmap链表长度大于8真的会变成红黑树吗?

1、本人博客《HashMap、HashSet底层原理分析》 2、本人博客《若debug时显示的Hashmap没有table、size等元素时&#xff0c;查看第19条》 结论 1、链表长度大于8时(插入第9条时)&#xff0c;会触发树化(treeifyBin)方法&#xff0c;但是不一定会树化&#xff0c;若数组大小小于…

Win11电脑速度慢、延迟高怎么办?

作为新版的系统&#xff0c;Windows 11还需要更多的时间完善。不少用户反映升级了Win11后反而感觉速度慢&#xff0c;还有延迟或死机现象。 如果你使用Win11系统时也有这种感觉&#xff0c;那这篇文章就是为你提供的。 问题可能出在系统存储容量低、驱动程序已过时&#xff0…

APP渗透抓包

APP渗透抓包1.APP渗透测试原理2.安装安卓模拟器抓包2.1.安装模拟器2.2.设置代理下载证书2.2.1.burp suite设置代理2.2.2.浏览器设置代理2.2.3.下载证书2.3.模拟器安装证书2.3.1.移动证书2.3.2.证书设置2.4.设置代理2.4.1.设置burp suite代理2.4.2.夜神模拟器代理2.5.抓包测试2.…

JVM调优及垃圾回收GC

一、说一说JVM的内存模型。JVM的运行时内存也叫做JVM堆&#xff0c;从GC的角度可以将JVM分为新生代、老年代和永久代。其中新生代默认占1/3堆内存空间&#xff0c;老年代默认占2/3堆内存空间&#xff0c;永久代占非常少的对内存空间。新生代又分为Eden区、SurvivorFrom区和Surv…

Node.js安装与配置

Node.js安装与配置 前言 本篇博文记录了Node.js安装与环境变量配置的详细步骤&#xff0c;旨在为将来再次配置Node.js时提供指导方法。 另外&#xff1a;Node.js版本请根据自身系统选择&#xff0c;安装位置、全局模块存放位置和环境变量应根据自身实际情况进行更改。 Node…

spring(四)——————从spring源码角度去解释前面的疑问

前面两篇文章&#xff0c;我们从mybatis-spring的插件包出发&#xff0c;探究如何将第三方框架集成到spring中&#xff0c;也知道了mybatis中使用了FactoryBeanImportBeanDefifinitionRegistrarImport对mapper进行注入。 不过我们在前两篇文章中仍然遗留很多疑点&#xff0c;例…