8. 函数式编程

函数式编程(FP)是一种编程风格,侧重于函数和最小化状态的变化(使用不可变的数据结构)。它更接近于用数学来表达解决方案,而不是循序渐进的操作。

在函数式编程里,其功能应该是“无副作用”(不会改变外部功能),参考透明的(一个函数每次传递相同的参数,返回相同的值)。

函数式编程可以被看作是一种更常见的命令式编程的替代,它更接近告诉计算机遵循每个步骤。

虽然函数式编程可以在Java 8 前实现,但在 Java 8 版本,通过 Lambda 和函数接口,才真正在语言层面上支持函数式编程。

Java 8、JavaScript、Groovy,Scala都支持函数式编程,他们虽然并不是严格意义上的函数式编程语言。

1. 函数和闭包

也许你也知道,在基本的函数式编程的语言里,函数才是第一等公民,这意味着函数可以在任何地方使用。

例如,在JavaScript里,你可以把一个函数指定给一个变量,并执行它:

var func = function(x) { return x + 1; }
var three = func(2); //3

尽管在 Groovy 里,函数并不具备第一等公民的特性,但有功能相似的方式实现:闭包。闭包就是在一对大括号里面包含的在“->”左边带有参数的代码块。例如:

def  closr = {x -> x + 1}
println( closr(2) ); //3

在 Groovy 里,如果闭包只有一个参数,那么默认 it就作为这个参数的引用,例如:

def  closr = {it + 1}

Tip

如果返回值是最后一个表达式,则return 关键字可以省略。

使用闭包

如果闭包作为方法的最后一个参数,或者方法只有一个参数,这种情况下,闭包的实现可以放在括号的外面,例如,下面的代码,定义了一个方法用来使用闭包对 List 里面的元素进行过滤:

def  find(list, tester) {
for (item in list)
if (tester(item)) return item
}

这个方法返回当闭包条件为 true时的第一个元素,下面就是调用的此闭包的代码:

 find([1,2,]) { it > 1 } // 2

映射 / 过滤 / 其他

一旦你掌握了函数,你很快会意识到需要一种方法来执行数据集合(或序列或数据流)的操作。

由于有些都是常见的操作,人们发明了顺序操作,如映射,过滤,聚合等操作。

下面的例子里,使用一个装有多个 Person对象的 List 集合来演示这些操作。



map(collect方法):把输入元素转化或改变成其他形式的元素。



filter(findAll方法):当 predicate 函数式接口为 true 时返回子集合。



reduce(inject方法):在元素上进行聚合操作(返回一个结构,例如所有元素的总和)。



Limit([0..n-1]):返回前 n 个元素。



Concat(+):结合两个不同的元素集合。

class Person { String name; int age }

def persons = [new Person(name:'Bob',age:20), new Person(name:'Tom',age:15)]

def names = persons.collect { person -> person.name }
def adults = persons.findAll { person -> return person.age >= 18 }
def totalAge = persons.inject(0){total, p -> return total + p.age}

上面的代码中,使用了inject方法,它会循环遍历每一个 List 中的元素,最后返回一个值。我们给total赋了一个初始值为0,最后我们把每个 Person 的年龄全部加起来得到一个总和。

Groovy 学习手册(5)的更多相关文章

  1. Groovy 学习手册(7)

    10. Groovy GPars GPars 一开始在 Groovy 中作为一个单独的项目,同时带来了很多并发的机制.它包含了很多并行的map/redue,Actors,以及其他很多并发的模块. 1. ...

  2. Groovy 学习手册(6)

    9. 不可变特性 不可变特性和函数式编程在一起就像是花生酱和果酱在一起一样.虽然没有必要非要在一起使用,但他们相处得很好. 在纯正的函数式语言中,每个函数对本身之外没有影响,即没有副作用.这意味着每次 ...

  3. Groovy 学习手册(4)

    6. 领域特定语言 Groovy 有许多特性,使它非常适合写DSL(领域特定语言).这些特性包活: 具有委托机制的闭包: 点号(.)和语句末尾的分号(;)是可选的: 运算符的重载(例如,加号,减号等) ...

  4. Groovy 学习手册(3)

    五. Groovy 的设计模式 设计模式是一种非常好的方式,可以使你的代码变得实用,可读又具有扩展性.跟 Java 相比,在 Groovy 里使用设计模式使代码更加简洁和容易. 1. 策略模式 设想一 ...

  5. Groovy 学习手册(2)

    二. 工具 1. 控制台 groovyConsole: Groovy 控制台是一个非常易于使用和简单的轻量级的编辑器.你可以在里面做很多事情. 在编辑器里面可以书写代码,Windows 下,按下Ctr ...

  6. Groovy 学习手册(1)

    1. 需要安装的软件 Java / Groovy 对应 Java 和 Groovy,你需要安装以下软件: Java JDK,例如 JDK 8 IDE,例如 Eclipse,NetBeans 8 Gro ...

  7. Kotlin强化实战!这份学习手册让你的面试稳如泰山

    一.引言 正如官网的slogan所描述:kotlin,是一门让程序员写代码时更有幸福的现代语言. 同时,也正如维基百科里介绍: JetBrains公司希望Kotlin能够推动IntelliJ IDEA ...

  8. Redis学习手册(目录)

    为什么自己当初要选择Redis作为数据存储解决方案中的一员呢?现在能想到的原因主要有三.其一,Redis不仅性能高效,而且完全免费.其二,是基于C/C++开发的服务器,这里应该有一定的感情因素吧.最后 ...

  9. git学习手册

    #git学习手册 git: Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理.[2] Git 是 Linus Torvalds 为了帮助管理 Linux内核开发而 ...

随机推荐

  1. spring boot与spring mvc的区别是什么?

    Spring 框架就像一个家族,有众多衍生产品例如 boot.security.jpa等等.但他们的基础都是Spring 的 ioc和 aop ioc 提供了依赖注入的容器 aop ,解决了面向横切面 ...

  2. sqlalchemy结果转json

    网上搜了下,http://blog.csdn.net/liu_xing_hui/article/details/8956107 介绍的很详细,自动一个Encoder给json的dump方法使用,能够实 ...

  3. Android View的事件分发机制

    准备了一阵子,一直想写一篇事件分发的文章总结一下.这个知识点实在是太重要了. 一个应用的布局是丰富的,有TextView,ImageView,Button等.这些子View的外层还有ViewGroup ...

  4. Ajax的优缺点及工作原理?

    定义和用法: AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML).Ajax 是一种用于创建快速动态网页的技术.Ajax 是一种在无 ...

  5. bootstrap设计站点中加入代码高亮插件

    这款插件的名字叫做google-code-prettify 使用该插件之前的效果: 使用插件之后的效果: 接下来说步骤: (1)下载两个文件 http://codecloud.sinaapp.com/ ...

  6. Python定向爬虫实战

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7019963.html 一:requests模块介绍 requests是第三方http库,可以十分方便地实现py ...

  7. Oracle列自增实现(2)-Identity Columns in Oracle Database 12c Release 1 (12.1)

    Oracle列自增-Identity Columns in Oracle Database 12c Release 1 (12.1) 在ORACLE 12C以前的版本中,如果要实现列自增长,需要通过序 ...

  8. Oracle Data Integrator 12cR1 (12.1.3.0.0)安装过程

    Oracle Data Integrator 12cR1 (12.1.3.0.0)安装过程 下载安装文件 Oracle Data Integrator 12cR1 (12.1.3.0.0) http: ...

  9. redmine3.3基于bitnami集成快速安装

    形而上学,此景此情,古今一般同!好的东西,逢人喜!redmine在当下还是不错的. 源码安装redmine,相对复杂基于ruby运行的!化繁为简实!追究极致万物! 00.环境及软件说明 bitnami ...

  10. Oracle下载汇聚

    官方下载oracl软件需要,注册oracle账户.方可下载.... Oracle11.2.0.4 Oracle11.2.0.4 for linux  1-7 http://pan.baidu.com/ ...