函数式编程

编程范式:命令式编程(Imperative)、声明式编程(Declarative)和函数式编程(Functional)

天大地大妈咪最大 提交于 2019-11-30 22:34:11
命令式编程 :命令“机器”如何去做事情(how),这样不管你想要的是什么(what),它都会按照你的命令实现。 声明式编程 :告诉“机器”你想要的是什么(what),让机器想出如何去做(how)。 函数式编程 : 和声明式编程是有所关联的,因为他们思想是一致的:即只关注做什么而不是怎么做。但函数式编程不仅仅局限于声明式编程。 函数式编程最重要的特点是“函数第一位”,即函数可以出现在任何地方,比如你可以把函数作为参数传递给另一个函数,你还可以将函数作为返回值。 命令式编程: 命令式编程的主要思想是关注计算机执行的步骤,即一步一步告诉计算机先做什么再做什么。 比如:如果你想在一个数字集合 collection(变量名) 中筛选大于 5 的数字,你需要这样告诉计算机: 第一步,创建一个存储结果的集合变量 results; 第二步,遍历这个数字集合 collection; 第三步:一个一个地判断每个数字是不是大于 5,如果是就将这个数字添加到结果集合变量 results 中。 代码实现如下: List<int> results = new List<int>(); foreach(var num in collection) { if (num > 5) results.Add(num); } 很明显,这个样子的代码是很常见的一种,不管你用的是 C, C++ 还是 C#, Java,

JDK8的新特性——Lambda表达式

泪湿孤枕 提交于 2019-11-30 10:32:20
 JDK8已经发布快4年的时间了,现在来谈它的新特性显得略微的有点“不合时宜”。尽管JDK8已不再“新”,但它的重要特性之一——Lambda表达式依然是不被大部分开发者所熟练运用,甚至不被开发者所熟知。   国内的开发环境大家都知道,有各种的老项目,有各种各样的发布风险,让公司以及项目组对新的技术往往望而却步,有公司甚至时至今日还在使用JDK6来进行项目开发,这导致了在很多技术的选择上受到了很大限制,进而不能跟随时代的脚步使得项目甚至公司一步一步走向衰落。   本文简单认识JDK8的重要新特性之一——Lambda表达式。 在JDK8之前,Java是不支持函数式编程的,所谓的函数编程,即可理解是将一个函数(也称为“行为”)作为一个参数进行传递。通常我们提及得更多的是面向对象编程,面向对象编程是对数据的抽象(各种各样的POJO类),而函数式编程则是对行为的抽象(将行为作为一个参数进行传递)。在JavaScript中这是很常见的一个语法特性,但在Java中将一个函数作为参数传递这却行不通,好在JDK8的出现打破了Java的这一限制。 认识Lambda表达式    首先来引入一个示例,不知给是否有在IDEA编写代码的经历,如果在JDK8的环境下如下所示按照Java传统的语法规则编写一个线程。 1 new Thread(new Runnable() { 2 @Override 3

JDK 8 函数式编程入门

半城伤御伤魂 提交于 2019-11-30 01:51:05
目录 1. 概述 1.1 函数式编程简介 1.2 Lambda 表达式简介 2. Lambda 表达式 2.1 Lambda 表达式的形式 2.2 闭包 2.3 函数接口 3. 集合处理 3.1 Stream 简介 3.2 Stream 常用操作 3.3 数据并行化操作 3.4 其他 参考 1. 概述 1.1 函数式编程简介 我们最常用的面向对象编程(Java)属于 命令式编程 (Imperative Programming)这种编程范式。常见的编程范式还有 逻辑式编程 (Logic Programming), 函数式编程 (Functional Programming)。 函数式编程作为一种编程范式,在科学领域,是一种编写计算机程序数据结构和元素的方式,它把计算过程当做是数学函数的求值,而避免更改状态和可变数据。 函数式编程并非近几年的新技术或新思维,距离它诞生已有大概50多年的时间了。它一直不是主流的编程思维,但在众多的所谓顶级编程高手的科学工作者间,函数式编程是十分盛行的。 什么是函数式编程?简单的回答:一切都是数学函数。函数式编程语言里也可以有对象,但通常这些对象都是恒定不变的 —— 要么是函数参数,要什么是函数返回值。函数式编程语言里没有 for/next 循环,因为这些逻辑意味着有状态的改变。相替代的是,这种循环逻辑在函数式编程语言里是通过递归

Clojure: 实现简单的数学表达式计算

左心房为你撑大大i 提交于 2019-11-30 00:48:18
我之前在知乎上回答了问题 按照运算符优先数法,画出算术表达式求值时,操作数栈和运算符栈的变化过程 。这次一方面也算是温故而知新,另一方面借此领略Clojure函数式编程之美。为了节省篇幅,本文只考虑 +、-、*、/ 这几种基本运算符以及只考虑小于10的整数运算。 栈变化图示 我们人类使用的算术表达式是中缀表达式,而计算机采用后缀表达式,也即逆波兰式。第一种方式是将表达式转为后缀表达式,再进行求值;第二种方式是直接对中缀表达式进行求值。本文就直接采用第二种方式了。 比如要对表达式 9-2*4+9/3 进行求值。首先需要使用2个栈来分别保存运算数和运算符,分别记为 opnd 和 optr。对表达式逐家符读入: 1、读入字符 '9',因为是运算数,则放入 opnd 栈中,剩余待读入字符串为:-2*4+9/3,此时 opnd 栈和 optr 栈如下图所示: 2、读入字符 '-',发现是运算符,则先和 optr 栈顶作比较,因为 optr 栈是空栈,故直接入栈 optr。剩余待读入字符串为:2*4+9/3,此时 opnd 栈和 optr 栈如下图所示: 3、接下来读入字符'2',发现是运算数,则入栈 opnd,剩余待读入字符串为:*4+9/3,此时opnd 栈和 optr 栈如下图所示: 4、接下来读入字符 '*',发现是运算符,则跟 optr 栈顶字符 '-' 进行比较,'*' 优先级高于

函数式编程杂谈

梦想的初衷 提交于 2019-11-29 18:56:56
本文首发于 vivo互联网技术 微信公众号 链接: https://mp.weixin.qq.com/s/gqw57pBYB4VRGKmNlkAODg 作者:张文博 比起命令式编程,函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断演进,逐层推导出复杂的运算。本文通过函数式编程的一些趣味用法来阐述学习函数式编程的奇妙之处。 一、编程范式综述 编程是为了解决问题,而解决问题可以有多种视角和思路,其中普适且行之有效的模式被归结为“编程范式”。编程语言日新月异,从汇编、Pascal、C、C++、Ruby、Python、JS,etc...其背后的编程范式其实并没有发生太多变化。抛开各语言繁纷复杂的表象去探究其背后抽象的编程范式可以帮助我们更好地使用computer进行compute。 1.命令式 计算机本质上是执行一个个指令,因此编程人员只需要一步步写下需要执行的指令,比如:先算什么再算什么,怎么输入怎么计算怎么输出。所以编程语言大多都具备这四种类型的语句: 运算语句将结果存入存储器中以便日后使用; 循环语句使得一些语句可以被反复运行; 条件分支语句允许仅当某些条件成立时才运行某个指令集合; 以及存有争议的类似goto这样的无条件分支语句。 使得执行顺序能够转移到其他指令之处。 无论使用汇编、C、Java、JS 都可以写出这样的指令集合

函数式编程杂谈

☆樱花仙子☆ 提交于 2019-11-29 18:37:20
本文首发于 vivo互联网技术 微信公众号 链接: https://mp.weixin.qq.com/s/gqw57pBYB4VRGKmNlkAODg 作者:张文博 比起命令式编程,函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断演进,逐层推导出复杂的运算。本文通过函数式编程的一些趣味用法来阐述学习函数式编程的奇妙之处。 一、编程范式综述 编程是为了解决问题,而解决问题可以有多种视角和思路,其中普适且行之有效的模式被归结为“编程范式”。编程语言日新月异,从汇编、Pascal、C、C++、Ruby、Python、JS,etc...其背后的编程范式其实并没有发生太多变化。抛开各语言繁纷复杂的表象去探究其背后抽象的编程范式可以帮助我们更好地使用computer进行compute。 1.命令式 计算机本质上是执行一个个指令,因此编程人员只需要一步步写下需要执行的指令,比如:先算什么再算什么,怎么输入怎么计算怎么输出。所以编程语言大多都具备这四种类型的语句: 运算语句将结果存入存储器中以便日后使用; 循环语句使得一些语句可以被反复运行; 条件分支语句允许仅当某些条件成立时才运行某个指令集合; 以及存有争议的类似goto这样的无条件分支语句。 使得执行顺序能够转移到其他指令之处。 无论使用汇编、C、Java、JS 都可以写出这样的指令集合

go 学习笔记之学习函数式编程前不要忘了函数基础

不羁的心 提交于 2019-11-29 18:18:09
在编程世界中向来就没有一家独大的 编程风格 ,至少目前还是 百家争鸣 的春秋战国,除了众所周知的 面向对象编程 还有日渐流行的 函数式编程 ,当然这也是本系列文章的重点. 越来越多的主流语言在设计的时候几乎无一例外都会参考 函数式特性 ( lambda 表达式,原生支持 map,reduce... ),就连面向对象语言的 Java8 也慢慢开始支持函数式编程,所以再不学习函数式编程可能就晚了! 但是在正式学习 函数式编程 之前,不妨和早已熟悉的 面向对象编程 心底里做下对比,通过对比学习的方式,相信你一定会收获满满,因此特地整理出来关于 Go 语言的 面向对象系列文章 ,邀君共赏. 猜猜看go是不是面向对象语言?能不能面向对象编程? go 学习笔记之详细说一说封装是怎么回事 go 学习笔记之是否支持以及如何实现继承 go 学习笔记之万万没想到宠物店竟然催生出面向接口编程? go 学习笔记之无心插柳柳成荫的接口和无为而治的空接口 上述系列文章讲解了 Go 语言 面向对象 相关知识点,如果点击后没有 自动跳转 ,可以关注微信公众号「雪之梦技术驿站」查看历史文章,再次感谢你的阅读与关注. 生物学家和数学家的立场不同 虽然是同一个世界,但是不同的人站在各自立场看问题,结果自然会千人千面,各有不同. 生物学家 会下意识对动植物进行分类归纳, 面向对象编程 也是如此,用一系列的抽象模型去 模拟

Hadoop系列之三:函数式编程语言和MapReduce

被刻印的时光 ゝ 提交于 2019-11-29 17:17:10
1、MapReduce和大数据问题 海量数据并行处理的核心思想无非是将一个较大的问题进行“分割包围、逐个歼灭”。然而其难点和关键点在于如何将一个大的问题分分割成多个可以分别在不同的CPU上或不同的主机上进行处理的独立小问题,而且这些独立进行处理的小问题所产生的中间结果又该如何合并成最终结果并予以输出。因此,看似简单的化整为零的处理思想却不得不面临如下的难题: (1) 如何将大问题分割为小任务?进一步地,如何将大问题分解为可以并行处理的小任务? (2) 如何将分解好的小任务派送给分布式系统中的某主机且是较为适合解决此问题的主机上的worker(进程)完成处理? (3) 如何保证某worker获取所需的数据? (4) 如何协调不同worker之间进行同步? (5) 如何将某worker的部分结果共享给其它需要此结果的worker? (6) 如何在出现软件或硬件故障时仍然能保证上述工作的顺利进行? 在传统的并行或分布式编程模型中,程序员不得不显式地解决上述的部分甚至是全部问题,而在共享内存编程中,程序员需要显式地协调对共享数据结构的如互斥锁的访问、显式地通过栅(barrier)等设备解决进程同步问题,并且要时刻警惕着程序中可能出现的死锁或竞争条件。虽然有些编程语言也或多或少地规避了让程序员面对上述问题,但却也避免不了将资源分配给各worker的问题

写给Android开发者的Kotlin入门

只愿长相守 提交于 2019-11-29 14:02:54
写给Android开发者的Kotlin入门 Google在今年的IO大会上宣布,将Android开发的官方语言更换为Kotlin,作为跟着Google玩儿Android的人,我们必须尽快了解和使用Kotlin语言。 不过Kotlin毕竟是语言级别的新事物,比起Java来说,从编程思想到代码细节都有不少变化,我们最好先对Kotlin有个整体的基本的了解,然后再去学习和使用,这样才能高效地掌握Kotlin语言。 Java的辉煌与阴影 1995年,当年如日中天的Sun公司发布了Java语言,引起了巨大的轰动,与当时主流的C语言和Basic语言比起来,Java语言简单、面向对象、稳定、与平台无关、解释型、多线程、动态等特点,就像是打开了一个新的世界,一时间风靡全球,云集者众,微软为了模仿Java搞出C#语言,Netscape为了赶时髦硬塞出一个JavaScript语言,IBM则捏着鼻子做了Java IDE Eclipse(日蚀,呵呵)。直到现在,Java在编程世界里还占据着举足轻重的地位,Andy Rubin在开发Android系统时,也很自然地采用了Java和C++(C++负责NDK开发)作为开发语言。 但是,Java毕竟是20多年前的语言了,虽然有不断扩展更新,但是底层设计思想是很难改动的,这就导致它很难实现一些新的语言特性,例如函数式编程、Lambda 表达式、流式API、高阶函数

【编程范式】函数式基础图示

倖福魔咒の 提交于 2019-11-29 13:37:47
函数式 起源于范畴论。其诞生就是「学术领域」影响「编程领域」的结果。 函数式就是要求用面向本质的、纯的函数,来完成求值的功能。是一种数学运算。 基本运算方式:「柯里化」与「合成」 函数式编程有两个最基本的运算:合成和柯里化。 数学运算要求「无状态编程」,函数本身不能有可保留的变量。 要求做到一个输入产生一个输出,同样的输入产生同样的输出。 柯里化(Curry)与合成(Compose)可以让多参数和多步骤的函数集合,生成一个单入单出的新函数。 详细资料 GitBook:函数式编程指南 阮一峰:函数式基础 来源: https://www.cnblogs.com/mazhaokeng/p/11518678.html