函数式编程(functional programming)学习总结

梳理一下函数式编程中的各个概念,会不定期更新。大部分是转载别人的文章,加一些感想,所以也不能算作原创。

之所以会写这个是看到了分享的一个ppt:
https://docs.google.com/presentation/d/1SwrUqNVVsHxmwmnT7QYsnf3b7gDi9lTZRD-4-wPLA28/edit#slide=id.p,我以前也接触过FP,但很少实际写,用FP比如scala写出来的代码的确很简洁,但总有不如imperative programming language来得直接的感觉。

lambda演算与currying

下面这篇文章讲得很清楚:

http://www.cnblogs.com/fox23/archive/2009/10/22/intro-to-Lambda-calculus-and-currying.html

lambda演算定义了一些和函数相关的操作,包括把函数当做参数、把函数当做返回值。currying则是指把一个带有n个参数的函数转化成n个单参数的函数链,通过只给部分参数赋值,进而引出partial function的概念。在scala等语言里面是直接支持currying的,python有相应的库functools.partial来支持。

Monad

Monad这个东西不好翻译也不好解释。知乎上有一个很好的讨论:

https://www.zhihu.com/question/19635359

其中有一条建议是:初学者不要随便写monad tutorial。。。误人子弟。。于是我就不敢多说了,不准确的讲,monad就是将一系列的操作序列给封装起来了。

异步编程(Asynchronous Programming)

对于大部分从C/C++走过来的人来说,异步编程是一个不大好掌握的东西。因为我们总是习惯于上一条语句执行完了再开始执行下一条,但是aynchronous就常常以为这上条语句的结果还没出来,下条语句就开始执行了。

异步编程常常和event based programming沾上边,比如网页中client和server的交互,发出http请求之后,不可能一直阻塞在那里等待响应返回或者超时事件发生,那样执行效率太低。

我接触的和异步编程的编程语言主要是node.js和scala,推荐两篇文章:

1.介绍scala中的future、promise等异步特性:

https://windor.gitbooks.io/beginners-guide-to-scala/content/chp8-welcome-to-the-future.html

2.介绍node.js中的异步相关:

http://www.infoq.com/cn/news/2011/09/nodejs-async-code

3.scala当中的actor,可以把actor理解成更细粒度的thread。

http://www.caimi.la/2014/06/05/scalaxue-xi-bi-ji-4-actorbian-cheng.html

要想深入了解,可以自己多去搜索资料。

java 8中添加的FP特色

lambda表达式、Function接口

java常被诟病的一点就是写出来的代码一大坨。。但其实就干了那么一点事情。。lambda表达式的引入可以大大简化java代码,比如sort函数,不需要自己写一个Comparator接口,直接传入一个lambda表达式就行了。

介绍:http://www.infoq.com/cn/articles/Java-se-8-lambda

方法引用(Method Reference)

在需要传递一个函数作为参数的地方,除了可以传入一个lambda表达式之外,也可以传递一个现成的方法。

参见http://blog.csdn.net/wwwsssaaaddd/article/details/37573517

流(stream)

流就是一个无穷长的序列,infinite sequence,当然了,内存有限的计算机无论如何都不可能存储得下无穷长度的序列。因此stream常常和lazy evaluation(惰性求值)关联在一起,只有在实际需要求值的时候才会把流中的值求出来。

一篇很好的介绍:http://blog.csdn.net/chszs/article/details/47038607

基于stream的操作往往强大而且简洁,常见的有map, filter, reduce,在python里面这些都是内置的函数,在其他编程语言中一般也有实现。

Optional类

java里面很烦人的一个异常就是NullPointerException,新引入的Optional类就是为了减少程序设计者处理NullPointerException的麻烦。Optional,顾名思义,就是这个类里面可能有数据,也可能没有。

一篇文章介绍:
http://examples.javacodegeeks.com/core-java/util/optional/java-8-optional-example/

在C++的boost库里面,也有一个类似的boost::optional:

http://www.boost.org/doc/libs/1_43_0/libs/optional/doc/html/boost_optional/examples.html

并行数组(Parallel Array)

在现代的处理器上,一般都是multiple core的,但是以前库函数里面的sort等算法都是串行的实现,为了充分开发并行性,java 8引入了parallel array.

http://itindex.net/detail/49339-java-%E5%B9%B6%E8%A1%8C-%E6%80%A7%E8%83%BD%E5%88%86%E6%9E%90

在数据量小的时候,并发去做一般得不偿失,但数据量很大的情况下往往可以获得几倍的加速。

总结

FP是个很神奇的东西,还需要不断学习和实践。。。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是几本 Java 函数式编程方面的书籍: 1. 《Java 8 实战》(Java 8 in Action):作者是 Raoul-Gabriel Urma、Mario Fusco 和 Alan Mycroft。这本书讲解了 Java 8 中的新特性,其中包括函数式接口、Lambda 表达式、流式 API 等。适合已有一定 Java 基础的读者。 2. 《Java 函数式编程》(Functional Programming in Java):作者是 Venkat Subramaniam。这本书从 Java 函数式编程的基础开始,逐步讲解了函数式编程的概念和技术。该书强调了函数式编程的优点,并提供了许多实例和案例。 3. 《Java 8 函数式编程》(Java 8 Functional Programming):作者是 Richard Warburton。这本书从 Java 8 开始讲解函数式编程。其中包括函数式编程的核心概念、Lambda 表达式、流式 API 等。该书还提供了大量实例和案例。 4. 《函数式思维:函数式编程入门指南》(Functional Thinking: Paradigm Over Syntax):作者是 Neal Ford。这本书从函数式编程的角度讲解了软件开发中的许多常见问题。它强调了函数式编程的思维方式,并讨论了如何在现有的 Java 代码中使用函数式编程的概念和技术。 这些书籍都是非常优秀的 Java 函数式编程方面的参考书籍,建议根据自己的实际需要进行选择。 ### 回答2: Java函数式编程是指在Java编程语言中使用函数式编程的技术和方法。这种编程范式的特点是把函数作为一等公民,可以作为参数传递、作为返回值,可以被存储在变量中。Java函数式编程的核心思想是通过使用lambda表达式和函数接口(Functional Interface)实现函数的定义、调用和组合,以达到简化代码、提高可读性和减少冗余的目的。 《Java编程思想》(Thinking in Java)第5版是一本经典的Java编程书籍,可以作为入门级的Java函数式编程指南。该书详细介绍了Java编程语言的各个方面,包括面向对象编程、多线程、异常处理等,同时也提供了一些关于函数式编程的内容。 《Java函数式编程》(Java 8 in Action)是一本深入介绍Java函数式编程的书籍。该书讲解了Java 8引入的函数式编程特性,如lambda表达式、函数接口和流(Stream)等。通过具体的示例和案例,读者可以了解到如何使用这些特性来编写简洁、高效的函数式程序。 《函数式编程思维》(Functional Thinking)是另一本值得推荐的Java函数式编程书籍。该书主要介绍了函数式编程的思维方式和经典的函数式编程概念,如函数组合、高阶函数和惰性求值等。通过深入理解这些概念,读者可以更好地应用函数式编程技术解决实际问题。 总之,选择一本合适的Java函数式编程书籍,对于提高自己的编程能力和理解函数式编程思想都是非常有帮助的。通过学习函数式编程,我们可以更好地利用Java语言的特性,编写出高质量的、易于维护的代码。 ### 回答3: Java函数式编程是利用函数作为一等公民的编程范式,它能够提供更加灵活、简洁和可复用的代码。以下是一些关于Java函数式编程的书籍推荐: 1. 《Java 8实战》 - 这本书由著名的Java专家实践者撰写,详细介绍了Java 8中引入的函数式编程特性,如Lambda表达式、流式编程和方法引用等。它提供了大量的示例和案例,帮助读者快速理解和应用这些特性。 2. 《Java函数式编程》 - 这本书详细讲解了Java中的函数式编程概念和方法,并介绍了函数式编程的核心概念,如高阶函数、纯函数和不可变性等。它还介绍了函数式编程的一些常用库和框架,如Guava和RxJava等。 3. 《函数式编程思维》 - 这本书并不是专门针对Java的函数式编程,而是介绍了函数式编程的一般思维方式和方法。它讲解了函数式编程的核心思想和原则,并提供了一些通用的实践技巧和设计模式。这本书可以帮助读者更好地理解和应用函数式编程的概念。 4. 《Java 8函数式编程》 - 这本书是专门为Java开发者准备的函数式编程指南。它介绍了Java 8中的函数式编程特性,并提供了一些实践案例和示例代码,帮助读者快速上手函数式编程。 5. 《Lambda编程指南》 - 这本书重点介绍了Java 8中引入的Lambda表达式和函数式接口,并详细讲解了它们的语法和用法。它还介绍了一些常用的函数式编程库和工具,如Stream API和函数式接口库。 以上是一些关于Java函数式编程的书籍推荐,它们可以帮助读者更好地理解和应用函数式编程的概念和技巧。无论是初学者还是有经验的Java开发者,都可以从这些书籍中获得实用的知识和经验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值