java方法用泛函_Java泛型那些事儿-程序员宅基地

技术标签: java方法用泛函  

1 泛值

明显有很大的重复以及各种硬编码(hard code):

public void saveStudentA() {

// TODO pseudo code

// insert A into table Student

}

public void saveStudentB() {

// TODO pseudo code

// insert B into table Student

}

所谓的“泛”,就是特殊到一般的过程,或者说是具体到抽象的过程:

public void saveStudent(Student xxx) {

// TODO pseudo code

// insert xxx into table Student

}

2 泛型(generic type)

假如你和你一个同事在开发一套系统,你负责“学生模块”,你有一个 saveStudent方法;你的同事负责“教师模块”,他有一个 saveTeacher 方法。

public void saveTeacher(Teacher xxx) {

// TODO pseudo code

// insert xxx into table Teacher

}

f0626257fdbbbb71aecc9f3e05ef32a3.png

2.1 泛型方法

减少因类型不同而产生的重复.

public void save (XXX xxx) {

// TODO pseudo code

// insert xxx into table XXX

}

2.2 泛型类

Comparable

3 泛函

高斯的求和

/** 求普通和 */

public static int sum() {

int sum = 0;

for (int i = 1; i <= 100; i++) {

sum += i;

}

return sum;

}

更多的求和

现在,让我们来看更多的求和问题,除了普通的求和,我们还可能想求比如平方和,那么可以这样写:

/** 求平方和 */

public static int sum() {

int sum = 0;

for (int i = 1; i <= 100; i++) {

sum += i * i;

}

return sum;

}

如果想求立方和,可以这样写:

/** 求立方和 */

public static int sum() {

int sum = 0;

for (int i = 1; i <= 100; i++) {

sum += i * i * i;

}

return sum;

}

泛函的解决方案(lambda 式)

import java.util.function.Function;

public class LamdbaFunctionalDemo {

public static void main(String[] args) {

int idSum = sum(integer -> integer);

int sqSum = sum(integer -> integer*integer);

int cuSum = sum(integer -> integer*integer*integer);

double sqSum2 = sumf(i -> Math.pow(i, 2));

double cbSum2 = sumf(i -> Math.pow(i, 3));

}

public static int sum(Function f) {

int sum = 0;

for (int i = 1; i <= 100; i++) {

sum += f.apply(i);

}

return sum;

}

public static double sumf(Function f) {

double sum = 0;

for (int i = 1; i <= 100; i++) {

sum += f.apply((double) i);

}

return sum;

}

}

所谓的“泛”

现在,我们来看所谓的“泛”,前面的篇章中也一再说了,就是一个从特殊到一般的过程:

0ecc8b7a01ddfd82c15dce34cb26732e.png

是一个从具体到抽象的过程:

cae300a88fc2a739b08d792ee3897b29.png

函数已经是一种抽象,我们还不满足,我们还要追求更高阶的抽象:

fc48230b18e445420096f935a27e9db4.png

还是那句话,从特殊到一般,从一般到更一般!无论是值的硬编码、类型的硬编码,还是行为的硬编码,能够被泛化的,我们都将其一一参数化,一般化。

在这一过程中,我们消除了重复,得到了极为抽象的代码,这些对值没有依赖,对类型也没有依赖,对具体行为也没有耦合的代码具有极强的普适性。依靠这些手段,我们不但消除了眼下的重复,甚至也消除了未来的重复。

当你写的代码越来越多,当你思考得越来越深,你一定对这一点体会越来越深。或许我们还不能将它清晰的表述出来,但我相信我们一定会逐渐地感受到,用陶潜的一句诗来结尾,可谓是:此中有真意,欲辨已忘言!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_31784241/article/details/114893902

智能推荐

Spark—结构化流Structured Streaming编程指南-Streaming Query_spark structured streaming foreachbatch-程序员宅基地

文章浏览阅读863次。定义了最终结果DataFrame/Dataset之后,剩下的就是开始流计算了,为此,必须使用Dataset.writeStream()方法返回的DataStreamWriter。而且必须在这个接口中指定一个或多个以下内容:1.输出接收器的详细信息:数据格式、位置等。2.输出模式:指定写入输出接收器的内容。3.查询名称:可选,为标识指定查询的唯一名称。4.触发间隔:可选,指定触发间隔。如果没有指定,系统将在之前的处理完成后立即检查新数据的可用性。如果由于之前的处理没有完成而错过了触发时间,那么_spark structured streaming foreachbatch

远程控制-Farfli远控木马-程序员宅基地

文章浏览阅读8.6k次。威胁描述:Farfli是一种运行于Windows系统的木马程序。该恶意代码通过创建服务方式自启。受此恶意代码感染的计算机可以被用作DDoS攻击Farfli家族木马的最新出现时间约在2007-2008年间,并且作者将源代码通过某种途径开源于互联网,导致各黑产组织在源代码的基础上衍生出诸多变种,以致Farfli家族木马达到了“泛滥成灾”的态势。据统计,一般家族的RAT木马年新增量在4000个左右,通过安天病毒库查询Farfli家族样本,2017全年其木马新增量达到了12,538个,远高于普通RAT木马的_farfli

vue-cli项目代理proxyTable如何配置exclude_vue2 proxytable中的属性-程序员宅基地

文章浏览阅读6k次。问题描述如果是前后端分离的项目,本地开发环境需要访问mock,或者在调试时直接访问线上的接口,这时候就会有接口跨域的问题(mock不存在跨域问题,但是用这个方法配置起来方便,姑且算是一个问题)。以vue-cli生成的项目为例,需要配置 config/index.js 中的 proxyTable 属性,大概如下: proxyTable: { '/pc/my/list/':_vue2 proxytable中的属性

SpringBoot启动流程源码解析_springboot启动源码分析-程序员宅基地

文章浏览阅读502次。SpringBoot启动流程_springboot启动源码分析

stm32f769discovery 寄存器配置ETH,无操作系统移植lwip141_dmabmr不清零-程序员宅基地

文章浏览阅读1.6k次。一直以来都想搞个寄存器配置版本的ETH,最近时间充裕,花了近2周,昨天终于实现了以太网的连接,上图 捕获.JPG (28.93 KB, 下载次数: 0)下载附件 保存到相册 2018-3-23 10:48 上传 这是打印结果 下面详细说明一下 首先实现lan8742的驱动/* Ethernet pins configuration ********************************..._dmabmr不清零

dbus(一)-程序员宅基地

文章浏览阅读8.7k次,点赞3次,收藏37次。dbusplus参考链接:dbus介绍dbusdbus通信与接口介绍1、dbus是什么东西?网上有一篇叫“D-Bus Tutorial”的文章,流传较广。不少介绍dbus的资料,都引用了其中的段落。其实相对于这篇文章,我建议大家直接读“D-Bus Specification”,篇幅不算长,文字也不算枯燥。D-Bus是针对桌面环境优化的IPC(interprocess communication )机制,用于进程间的通信或进程与内核的通信。最基本的D-Bus协议是一对一的通信协议。但在很多情况下_dbus

随便推点

Servlet3.0通过注解方式完成提交_用注释法完成对servlet文件的发布-程序员宅基地

文章浏览阅读3.3k次。以前我们要想完成以下动作时候是不是要在web.xml中配置提交的路径现在完全不用了,在Servlet中添加注解就可以了方法1:通过@WebServlet(urlPatterns = “/LoginServlet”)中的urlPatterns 添加一个提交名称..._用注释法完成对servlet文件的发布

Java第三次作业_一般控制杆有四个位置(档位):停止、间歇、低速和高速,刻度盘有三个位置(刻度),分-程序员宅基地

文章浏览阅读3.5k次。问题描述:有品牌汽车的风挡玻璃雨刷(Wiper)是由带刻度盘(Dial)的控制杆(Lever)控制的。这种控制杆有四个位置:停止、间歇、低速和高速,刻度盘有三个位置,分别是数字1、2和3。刻度盘位置指示三种间歇速度,刻度盘的位置只有当控制杆在间歇位置时才有意义。以下表格给出了挡风玻璃雨刷对应控制杆和刻度盘的工作速度(每分钟摇摆次数):控制杆停止间歇间歇间歇低速高速刻度盘——123————雨刷046_一般控制杆有四个位置(档位):停止、间歇、低速和高速,刻度盘有三个位置(刻度),分

Java字面量:整数、小数、字符、字符串的输出-程序员宅基地

文章浏览阅读326次,点赞7次,收藏8次。Java字面量:整数、小数、字符、字符串的输出

分层图最短路--最通俗易懂的讲解_分层最短路-程序员宅基地

文章浏览阅读1w次,点赞47次,收藏91次。分层图最短路是指在可以进行分层图的图上解决最短路问题。分层图:可以理解为有多个平行的图。一般模型是:在一个正常的图上可以进行k次决策,对于每次决策,不影响图的结构,只影响目前的状态或代价。一般将决策前的状态和决策后的状态之间连接一条权值为决策代价的边,表示付出该代价后就可以转换状态了。一般有两种方法解决分层图最短路问题:建图时直接建成k+1层。 多开一维记录机会信息。当然具..._分层最短路

Apache Spark【从无到有从有到无】【编程指南】【AS6】Spark Streaming编程指南_as6 编程-程序员宅基地

文章浏览阅读275次。目录1.概观2.一个简单的例子3.基本概念3.1.链接3.2.初始化StreamingContext3.3.离散流(DStreams)3.4.输入DStreams和Receivers3.4.1.基本来源3.4.2.高级资源3.4.3.自定义来源3.4.4.接收器可靠性3.5.DStreams的转换3.5.1.UpdateStateByKey操作..._as6 编程

http请求 405错误_http 405-程序员宅基地

文章浏览阅读8.4w次,点赞45次,收藏27次。http请求 405错误 方法不被允许 (Method not allowed)405错误常常伴随着POST请求,所有有好多人会告诉你这些:But 时候他并不能解决你的问题。所以我说一点不一样的。假如你有一个user类,里面有两个属性userName,password 数据类型分别为int 和 String。前台表单提交并且是post请求。后台用user接受参数,也是post请求同样也会报405。可能原因是你输入的参数与user所需要的参数类型不匹配。请仔细排查。如果能帮到你,请不要吝啬_http 405

推荐文章

热门文章

相关标签