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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值