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

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

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

public static int add(int a, int b){return a + b;}

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

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

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

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

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


importjava.util.Date;public classTrade {private intid;//交易的idprivateStringcountry;//交易的国家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() {@Overridepublic booleantest(Trade trade) {return"America".equals(trade.getCountry());}});

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

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

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

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

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

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

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

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

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

Java8函数式编程之一: 行为参数化相关推荐

  1. [2017.02.23] Java8 函数式编程

    以前学过Haskell,前几天又复习了其中的部分内容. 函数式编程与命令式编程有着不一样的地方,函数式编程中函数是第一等公民,通过使用少量的几个数据结构如list.map.set,以及在这些数据结构上 ...

  2. java8 函数式编程_如何使用Java 8函数式编程生成字母序列

    java8 函数式编程 我偶然发现了用户" mip"一个有趣的堆栈溢出问题 . 问题是: 我正在寻找一种生成字母序列的方法: A, B, C, ..., Z, AA, AB, AC ...

  3. java8 函数式编程_使用Javaslang进行Java 8中的函数式编程

    java8 函数式编程 我们非常高兴地在jOOQ博客上宣布一个客座帖子,该帖子由HSH Nordbank的高级软件工程师Daniel Dietrich (三人的丈夫和父亲)撰写. 他目前作为项目负责人 ...

  4. java8 函数式编程_Java 8函数式编程:延迟实例化

    java8 函数式编程 单例通常会延迟实例化自己,有时,如果对象足够重,则可以延迟实例化类字段. 通常,在走惰性路线时,getter方法(或accessor )必须具有一段代码,该代码块在返回对象之前 ...

  5. java8 函数式编程_您必须学习Java 8的函数式编程吗?

    java8 函数式编程 我最近一直在研究Java 8,并掌握了Manning出版的" Java 8 In Action" . 让我印象深刻的第一件事是Java 8独特的销售主张是函 ...

  6. Java8函数式编程详解

    Java8 函数式编程详解 Author:Dorae Date:2017年11月1日23:03:26 转载请注明出处 说起Java8,可能很多人都已经知道其最大的改进,就是引入了Lambda表达式与S ...

  7. Java8函数式编程_8--设计和架构的原则

    1,免责声明,本文大部分内容摘自<Java8函数式编程>.在这本书的基础上,根据自己的理解和网上一些博文,精简或者修改.本次分享的内容,只用于技术分享,不作为任何商业用途.当然这本书是非常 ...

  8. Java8函数式编程语法入门

    Java8函数式编程语法入门 Java8中函数式编程语法能够精简代码. 使用Consumer作为示例,它是一个函数式接口,包含一个抽象方法accept,这个方法只有输入而无输出. 现在我们要定义一个C ...

  9. Java8函数式编程_9--使用Lambda表达式编写并发程序

    1,免责声明,本文大部分内容摘自<Java8函数式编程>.在这本书的基础上,根据自己的理解和网上一些博文,精简或者修改.本次分享的内容,只用于技术分享,不作为任何商业用途.当然这本书是非常 ...

最新文章

  1. 直播|人大高瓴周骁:时空大数据与智慧城市前沿
  2. 深度学习核心技术精讲100篇(三十五)-美团餐饮娱乐知识图谱——美团大脑揭秘
  3. leetcode python 011
  4. Intellij Idea搭建Spark开发环境
  5. OpenCV-Python实战(8)——直方图均衡化
  6. Protobuf import文件导入其他proto
  7. 初识Jasima-调度仿真系列教程预告
  8. C语言UDP socket编程
  9. segue跳转_使用SwiftUI的Segue Shenanigans
  10. Spring MVC整合FreeMarker
  11. 分享解决方法:为什么QQ聊天框中无法使用输入法输入中文?
  12. 国内外计算机CPU差异,Intel 9代和10代CPU差别真的很大?配电脑看它选择不后悔
  13. 有了ElasticSearch为什么还要用MySQL?-这篇文章告诉你
  14. git生成SSH秘钥
  15. 为什么 application data文件夹是无限循环的
  16. 明日服务器中断,明日之后服务器断开连接怎么办
  17. excel表格经纬度同表格分成经度纬度两个表格
  18. 南加大计算机专业硕士申请,南加州大学计算机科学专业硕士申请条件独家整理附案例分析...
  19. 分布式搜索引擎的研究
  20. 记录一次oracle中count特别慢的解决方案

热门文章

  1. 2022成都市专利培育中心项目资助申报主体条件条件及资助标准
  2. Google 手机地图-中国版~
  3. RuntimeError: Physical devices cannot be modified after being initialized
  4. 什么是元宇宙,它对未来意味着什么?
  5. SMT 常用术语解释
  6. MacOs “无法打开***,因为无法验证开发者...”
  7. html背景图与表面图不对齐,html – 将内容与背景图像对齐
  8. 更聪明的免费图片素材搜素引擎 Everypixel 用 AI 排除俗气照片
  9. 视频剪切合并器使用方法,如何使用视频剪切合并器分割合并视频片段
  10. ​PNAS:alpha频率经颅电刺激调控大脑默认网络