函数式编程

python进阶一(函数式编程)【2-5 python中的自定义排序函数】

匿名 (未验证) 提交于 2019-12-02 22:51:30
2-5 python中的自定义排序函数 python中自定义排序函数 Python内置的 sorted()函数 可对list进行排序: >>> sorted ([ 36 , 5 , 12 , 9 , 21 ]) [ 5 , 9 , 12 , 21 , 36 ] 但 sorted()也是一个高阶函数,它可以 接收一个比较函数来实现自定义排序 ,比较函数的定义是,传入两个待比较的元素 x, y,如果 x 应该排在 y 的前面,返回 -1,如果 x 应该排在 y 的后面,返回 1。如果 x 和 y 相等,返回 0。 因此,如果我们要实现倒序排序,只需要编写一个reversed_cmp函数: 1 def reversed_cmp ( x , y ): 2 if x > y : 3 return - 1 4 if x < y : 5 return 1 6 return 0 这样,调用 sorted() 并传入 reversed_cmp 就可以实现倒序排序: 1 >>> sorted ([ 36 , 5 , 12 , 9 , 21 ], reversed_cmp ) 2 [ 36 , 21 , 12 , 9 , 5 ] 注意 :这里的格式写法和其他高阶函数不同,先写list后写函数名称 sorted()也可以对字符串进行排序,字符串默认按照ASCII大小来比较: 1 >>> sorted ([

函数式响应式编程 - Functional Reactive Programming

匿名 (未验证) 提交于 2019-12-02 21:53:52
我们略过概念,直接看函数式响应式编程解决了什么问题。 故事从下面这个例子展开: 两个密码输入框,一个提交按钮。 密码、确认密码都填写并一致,允许提交;不一致提示错误。 HTML 如下: <input id="pwd" placeholder="输入密码" type="password" /><br /> <input id="confirmPwd" placeholder="再次确认" type="password" /> <label id="errorLabel"></label><br /> <button id="submitBtn" disabled>提交</button> const validate = () => { const match = pwd.value === confirmPwd.value; const canSubmit = pwd.value && match; errorLabel.innerText = match ? "" : "密码不一致"; if (canSubmit) { submitBtn.removeAttribute("disabled"); } else { submitBtn.setAttribute("disabled", true); } }; pwd.addEventListener("input", validate

函数式编程简介-附入门方法

匿名 (未验证) 提交于 2019-12-02 21:53:52
函数式编程是一种编程范式。 编程范式又是什么? 编程范式是一种解决问题的思路。 我们熟悉的命令式编程把程序看作 一系列改变状态的指令 ;而函数式编程把程序看作 一系列数学函数映射的组合 。 编程范式和编程语言无关,任何编程语言都可以按照函数式的思维来组织代码。 i++; // 命令式 关心指令步骤 [i].map(x => x + 1); // 函数式 关心映射关系 易写易读 聚焦重要逻辑,摆脱例如循环之类的底层工作 易复用 面向对象可复用的单位是类,函数式可复用的是函数,更小更灵活 易测 纯函数【后面会讲】不依赖外部环境,测试起来准备工作少 看起来很厉害 被人夸奖能增强信心和动力,所以这点也很重要 方法不难,回学校念个博士,搞清楚范畴论,幺半群之类的就可以了。 人生苦短,还是来点实际的吧。 filter map reduce 三板斧用好,从循环中解放出来 small pure function 多写小的纯函数,小指功能聚焦 compose pipeline curry 三个工具利用好,把小函数像搭积木一样拼成大函数 来个例子:找出集合中的素数,算出它们平方的和。 const isPrimeNumber = x => { if (x <= 1) return false; let testRangStart = 2, testRangeEnd = Math.floor(Math

Java8函数式编程--Lambda表达式

匿名 (未验证) 提交于 2019-12-02 21:53:52
1,免责声明,本文大部分内容摘自 《Java8函数式编程》 。在这本书的基础上,根据自己的理解和网上一些博文,精简或者修改。本次分享的内容,只用于技术分享,不作为任何商业用途。当然这本书是非常值得一读,强烈建议买一本! 2,本次分享的样例代码均上传到github上, 请点击这里 。 主要内容如下: 2.1 第一个Lambda表达式 2.2 如何识别Lambda表达式 2.3 引用的是值,而不是变量 2.4 函数接口 2.5 类型推导 2.6 要点回顾 Android Button 点击监听器语法如下: // 例2-1 使用匿名内部类将行为和按钮单击进行关联 button . setOnClickListener ( new View . OnClickListener () { @Override public void onClick ( View view ) { Log . v ( "View" , "button clicked!" ); } }); 在这个例子中,我们创建一个新对象,它实现了 View.OnClickListener 接口。这个接口只有一个方法 onClick() ,当用户点击屏幕上的button,button就会被调用这个方法。匿名内部类实现了该方法,这实际上是一个 代码即数据 的例子 ―― 我们给button传递了一个代表某种行为的对象。

Java8 函数式编程详解

匿名 (未验证) 提交于 2019-12-02 21:53:52
Java8 函数式编程详解 说起Java8,可能很多人都已经知道其最大的改进,就是引入了Lambda表达式与Stream,毕竟Java9都已近发布了,Java8发布了也已经近三年。那么,今天我们就先来讲一下Java8引入的Lambda表达式,以及由此引入的函数式编程,以及函数式接口。 什么是函数式编程 函数式编程并不是Java新提出的概念,其与指令编程相比,强调函数的计算比指令的计算更重要;与过程化编程相比,其中函数的计算可以随时调用。 当然,大家应该都知道面向对象的特性(抽象、封装、继承、多态)。其实在Java8出现之前,我们关注的往往是某一类对象应该具有什么样的属性,当然这也是面向对象的核心--对数据进行抽象。但是java8出现以后,这一点开始出现变化,似乎在某种场景下,更加关注某一类共有的行为(这似乎与之前的接口有些类似),这也就是java8提出函数式编程的目的。如图1-1所示,展示了面向对象编程到面向行为编程的变化。 ͼ1-1 为什么需要Lambda表达式 首先,不得不提增加Lambda的目的,其实就是为了支持函数式编程,而为了支持Lambda表达式,才有了函数式接口。另外,为了在面对大型数据集合时,为了能够更加高效的开发,编写的代码更加易于维护,更加容易运行在多核CPU上,java在语言层面增加了Lambda表达式。 第一个Lambda表达式 前边废话了这么多

廖雪峰Java16函数式编程-2Stream-7其他操作

匿名 (未验证) 提交于 2019-12-02 21:52:03
Stream<T> sorted(); //按元素默认大小排序(必须实现Comparable接口) Stream<T> sorted(Comparator<? super T> cp); //按指定Comparator比较的结果排序 public static void main(String[] args){ Stream<String> s = Stream.of("hello","JAVA","python","RUBY","PHP"); s.sorted().forEach(str-> System.out.print(str+"\t")); System.out.println(); Stream<Integer> s1 = Stream.of(1,9,5,3,7); s1.sorted(Comparator.reverseOrder()).forEach(str-> System.out.print(str+"\t")); } Stream<T> distinct(); //返回去除重复元素的Stream Stream<String> s = Stream.of("hello","JAVA","hello","RUBY","JAVA"); s.distinct().forEach(str-> System.out.print(str+"\t")); Stream<T>

JAVA-进阶(函数式编程)

匿名 (未验证) 提交于 2019-12-02 21:45:52
JAVA-进阶(函数式编程) 1.首先理解什么是 Lambda表达式? 简单来说,我们定义一个函数,往往要去想怎么调用,怎么创建对象,但是 Lambda表达式的思想是,我不用去管你怎么去做这件事情,我只关心你在做什么(有点绕口,多读两边)。我们只是为了达到目的,过程和形式并不重要。 2.代码体现? 以Runnable接口为例:  普通的写法(实现内部类接口) 1 public class Demo01Runnable { 2 public static void main(String[] args) { 3 // 匿名内部类 4 Runnable task = new Runnable() { 5 @Override 6 public void run() { // 覆盖重写抽象方法 7 System.out.println("多线程任务执行!"); 8 } 9 }; 10 new Thread(task).start(); // 启动线程 11 } 12 }  Lambda表达式写法 public class Demo02LambdaRunnable { public static void main(String[] args) { new Thread(() -> System.out.println("多线程任务执行!")).start(); // 启动线程 } } 3.

Java8函数式编程的宏观总结

孤人 提交于 2019-12-02 18:33:44
1.java8优势 通过将行为进行抽象,java8提供了批量处理数据的并行类库,使得代码可以在多核CPU上高效运行。 2.函数式编程的核心 使用不可变值和函数,函数对一个值进行处理,映射成另一个值。 3.Lambda表达式 一种紧凑的、传递行为的方式。 4. 静态类型语言 java8依旧是静态类型语言,javac依旧会在编译时,对参数类型进行检查。 5.函数接口 只有一个抽象方法的接口,用作lamdba表达式的类型。 6.对核心类库的改进-Stream 实现机制 整个过程:一系列惰性求值方法+最后一个及早求值方法 常用流操作 collect 及早求值的方法,用于生成list,set,map。 map 将一个流中的值转化为一个新的流,对应的业务逻辑是:有一个函数需要将一种类型的值转为另一种类型。 filter 遍历数据并检查其中的元素,过滤掉不符合条件的元素。接受一个Predicate接口 flatmap 可用Stream替换值,然后将多个Stream连接成一个Stream 例如:List together=Stream.of(list1,list2,…,listn).flatMap(num->num.stream()).collect(Collectors.toList()); max和min 参数:参数为排序指标 格式:xx.stream().max(Comparator

Javascript 函数式编程

拜拜、爱过 提交于 2019-12-02 18:32:57
本文转载于: 猿2048 网站➣ Javascript 函数式编程 定义 函数式编程(英语:functional programming)或称函数程序设计,又称泛函编程,是一种 编程典范 ,它将计算机运算视为 数学 上的 函数 计算,并且避免使用 程序状态 以及 易变对象 。 什么是数学函数 初中数学中定义 设在一个变化过程中有两个变量x与y,如果对于x的每一个值,y都有唯一的值与它对应,那么就说x是自变量,y是x的函数. 第一个图片每一个x 对应唯一一个y 值,此为函数 第二张图片x=5对应 多个y的值,所以此不为函数 举例来说,现在有这样一个数学表达式: (1 + 2) \* 3 - 4 传统的过程式编程,可能这样写: var a = 1 + 2; var b = a \* 3; var c = b - 4; 函数式编程要求使用函数,我们可以把运算过程定义为不同的函数,然后写成下面这样: var result = subtract(multiply(add(1,2), 3), 4); 函数风格的编程特点 纯函数,没有副作用 引用透明 不修改状态 声明式与命令式 函数是第一等公民 纯函数,没有副作用 在Javascript中对于数组的操作,有些是纯的,有些就不是纯的。 下面来举个栗子: var arr = [1,2,3,4,5]; arr.slice(0,3); //=\> [1

Java Stream函数式编程图文详解(二):管道数据处理

笑着哭i 提交于 2019-12-02 18:18:57
一、Java Stream管道数据处理操作 在本号之前发布的文章《Java Stream函数式编程?用过都说好,案例图文详解送给你》中,笔者对Java Stream的介绍以及简单的使用方法给大家做了介绍。在开始本文之前,我们有必要介绍一下这张Java Stream 数据处理过程图,图中主要分三个部分: 将数组、集合类、文本文件转换为管道流(图中的蓝色方块的部分,在本号的上一篇文章中已经给大家介绍过了) Java Stream管道数据处理操作(也就是下图中中间的虚线内的数据处理操作,本文的主要内容) 管道流处理结果的聚合、累加、计数、转换为集合类等操作(图中的绿色方块部分) 需要注意的是:Java Stream的中间数据处理操作的输入是一个管道流(Stream),输出仍然是一个管道流(Stream)。下面我们就来详细的学习一下!在上一篇文章中,我们给大家讲了这样一个例子: List<String> nameStrs = Arrays.asList("Monkey", "Lion", "Giraffe","Lemur"); List<String> list = nameStrs.stream() .filter(s -> s.startsWith("L")) .map(String::toUpperCase) .sorted() .collect(toList()); System