Java8函数式编程之一: 行为参数化

Java8区别于以前的Java版本的一个重要特点就是函数式编程的风格。

那什么是函数式的编程风格呢?

理解函数式编程之前让我们先看一下以前的编程方式,也就是命令式编程。比如计算两个数的和:

public static int add(int a, int b){

return a + b;

}

命令式编程传递的是数据,也就是参数a和参数b;而函数式编程传递的则是行为。比如,“相加”这个操作就是一种行为,或者说是动作。

函数式编程是将“行为”或者“动作”作为参数,也就是行为参数化。

在讲解具体的行为参数化之前,我们看看为什么需要行为参数化。

——————————————————————————

这是一个实体域,表示一个公司的所进行的交易。

importjava.util.Date;

public classTrade {

private intid;//交易的id

privateStringcountry;//交易的国家

privateDatedate;//交易的日期

private doublemoney;//交易的金额

privateStringtrader;//交易员

public intgetId() {

returnid;

}

public voidsetId(intid) {

this.id= id;

}

publicString getCountry() {

returncountry;

}

public voidsetCountry(String country) {

this.country= country;

}

publicDate getDate() {

returndate;

}

public voidsetDate(Date date) {

this.date= date;

}

public doublegetMoney() {

returnmoney;

}

public voidsetMoney(doublemoney) {

this.money= money;

}

publicString getTrader() {

returntrader;

}

public voidsetTrader(String trader) {

this.trader= trader;

}

}

——————————————

现在有一个需求,你的老板需要筛选出在美国发生的交易

//筛选出在美国发生的交易

public staticList filterTradeInAmerica(List trades) {

List list =newArrayList<>();

for(Trade trade : trades) {

if("America".equals(trade.getCountry())) {

list.add(trade);

}

}

returnlist;

}

——————————————

如果现在你的老板改变主意了,他需要找出在英国进行的交易怎么办?

你可能会觉得简单,只需要将方法名字改为filterTradeInUK,然后将if语句里换一下就可以。

但是这样会造成很多的重复代码,并且国家那么多,你不可能一个一个的每个都写。

——————

当然,大家会想到这样一种方法,将国家作为参数传递。

//将国家作为参数传递

public staticList filterTradeByCountry(List trades, String country) {

List list =newArrayList<>();

for(Trade trade : trades) {

if(trade.getCountry().equals(country)) {

list.add(trade);

}

}

returnlist;

}

——————————————————————

好像解决了一部分问题,但老板的需求是无穷无尽的,他万一想知道交易金额大的和交易金额小的交易呢?比如,交易额大于100(w)的交易。你可能会这样做。

//如果需要又要需要根据交易金额的大小进行筛选.找出大于100万的交易

public staticList filterTradeByCountry(List trades,doublemoney) {

List list =newArrayList<>();

for(Trade trade : trades) {

if(trade.getMoney() >100) {

list.add(trade);

}

}

returnlist;

}

————————————————————

这样虽然满足了需求,但是带来了巨大的问题,大量重复的代码,更为麻烦的是,一个交易重要的字段有很多,如果我们对每个属性都做这样的筛选的话,那么代码会变得非常繁琐,客户端在调用的时候也会更加的麻烦。

————————————————————

行为参数化

我们现在考虑根据交易的某些属性来返回一个boolen值,比如交易是不是发生在美国,交易金额是不是大于某个数值等等。

我们将其称为谓词(Predicate,即一个返回boolean值的函数)。定义一个接口:

public interfaceTradePredicate {

booleantest(Trade trade);

}

现在我们来让filterTrade()方法接收多种行为,也就是这样:

//filter方法接收多种行为 . 谓词对象封装了Trade的条件,你传递什么进去都可以

public staticList filterTrade(List trades, TradePredicate predicate) {

List list =newArrayList<>();

for(Trade trade : trades) {

if(predicate.test(trade)) {

list.add(trade);

}

}

returnlist;

}

此时你在main方法中调用的话,就可以怎样做啦!

List tradeInAmerica =filterTrade(trades,newTradePredicate() {

@Override

public booleantest(Trade trade) {

return"America".equals(trade.getCountry());

}

});

分析一下:TradePredicate是一个谓词,此时我们就把它看作一个行为,在真正去使用它之前,我们并不知道它具体是干什么的。我们在使用它的时候,传递的是一个行为,现在使用的是匿名内部类。

这就是行为参数化,也就是函数式编程的一个重要的特征。

不过现在看来,使用匿名内部类的代码仍然看着很烦,放心,Java8很好的为我们解决了这样的一个问题,那就是大名鼎鼎的Lambda表达式。至于什么是Lambda表达式,它有什么样的作用呢,请阅读下一篇博客。Java8函数式编程之二 : Lambda表达式 - 简书 

——————————————

重点笔记:来自《Java8实战》

行为参数化:一个方法接收多个不同的行为作为参数,并在内部使用它们,完成不同行为的能力。

行为参数化可以让代码更好的适应不断变化的需求,减轻未来的工作量。

————————————————————

在此推荐 《Java8实战》,此书讲Java8的例子比较浅显易懂。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容