函数式编程

java8 函数式编程

一曲冷凌霜 提交于 2019-12-16 02:53:26
函数式接口 函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。 函数式接口可以被隐式转换为 lambda 表达式。 Lambda 表达式和方法引用(实际上也可认为是Lambda表达式)上。 定义函数式接口 @FunctionalInterface interface Hello { void helloWorld ( String name ) ; } 实现该接口 Hello hello = System . out : : println ; hello . helloWorld ( "Hello World!!!" ) ; JDK 1.8 新增的函数接口 java.util.function 包含了很多类,用来支持Java的函数式编程. 1. Operator 接口 BinaryOperator<T> 代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果 DoubleBinaryOperator 接受两个参数同为类型double,返回值类型也为double IntBinaryOperator 接受两个参数同为类型int,返回值类型也为int LongBinaryOperator 接受两个参数同为类型long,返回值类型也为long DoubleUnaryOperator

什么是(功能)反应式编程?

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-11 17:29:50
我已经读过关于 反应式编程 的维基百科文章。 我还阅读了关于 功能反应式编程 的小文章。 描述非常抽象。 功能反应式编程( FRP )在实践中意味着什么? 反应式编程(与非反应式编程相反?)由什么组成? 我的背景是命令式/ OO语言,因此可以理解与此范例相关的解释。 #1楼 好的,从背景知识和阅读您指向的维基百科页面,似乎反应式编程就像数据流计算,但具有特定的外部“刺激”触发一组节点触发并执行其计算。 这非常适合于UI设计,例如,触摸用户界面控件(例如,音乐播放应用程序上的音量控制)可能需要更新各种显示项目和音频输出的实际音量。 当你修改音量(一个滑块,比方说)时,它对应于修改与有向图中节点相关的值。 具有来自该“音量值”节点的边缘的各种节点将被自动触发,并且任何必要的计算和更新将自然地波及整个应用程序。 应用程序“响应”用户刺激。 功能性反应式编程只是在功能语言中实现这一思想,或者通常在函数式编程范例内实现。 有关“数据流计算”的更多信息,请在维基百科上搜索这两个单词或使用您最喜欢的搜索引擎。 一般的想法是这样的:程序是节点的有向图,每个节点执行一些简单的计算。 这些节点通过图形链接相互连接,图形链接将某些节点的输出提供给其他节点的输入。 当节点触发或执行其计算时,连接到其输出的节点将其相应的输入“触发”或“标记”。 触发/标记/可用的所有输入的任何节点都会自动触发。

[Google Guava] 4-函数式编程

扶醉桌前 提交于 2019-12-10 15:55:38
原文链接 译文链接 译者:沈义扬,校对:丁一 注意事项 截至JDK7,Java中也只能通过笨拙冗长的匿名类来达到近似函数式编程的效果。预计JDK8中会有所改变,但Guava现在就想给JDK5以上用户提供这类支持。 过度使用Guava函数式编程会导致冗长、混乱、可读性差而且低效的代码。这是迄今为止最容易(也是最经常)被滥用的部分,如果你想通过函数式风格达成一行代码,致使这行代码长到荒唐,Guava团队会泪流满面。 比较如下代码: 01 Function<String, Integer> lengthFunction = new Function<String, Integer>() { 02 public Integer apply(String string) { 03 return string.length(); 04 } 05 }; 06 Predicate<String> allCaps = new Predicate<String>() { 07 public boolean apply(String string) { 08 return CharMatcher.JAVA_UPPER_CASE.matchesAllOf(string); 09 } 10 }; 11 Multiset<Integer> lengths = HashMultiset.create( 12

JavaSE-函数式编程接口

安稳与你 提交于 2019-12-10 12:05:58
目录 第一章:函数式接口 1.1 函数式接口介绍 1.2 格式 1.3 @FunctionalInterface注解 1.4 自定义函数式接口 第二章:函数式编程 2.1 Lambda延迟执行 2.2 使用Lambda作为参数和返回值 第三章:常用的函数式接口 3.1 Supplier接口 3.2 Consumer接口 3.3 Predicate接口 3.4 Function接口 第一章:函数式接口 1.1 函数式接口介绍 ​ 函数式接口在Java中是指: 有且仅有一个抽象方法的接口 。 ​ 函数式接口,即适用于函数式编程场景的接口。而Java中的函数式编程体现就是Lambda,所以函数式接口就是可以适用于Lambda使用的接口。只有确保接口中有且仅有一个抽象方法,Java中的Lambda才能顺利地进行推导。 从应用层面来讲,Java中的Lambda可以被当做是匿名内部类的“语法糖”,但是二者在原理上是不同的。 1.2 格式 只要确保接口中有且仅有一个抽象方法即可: 修饰符 interface 接口名称 { public abstract 返回值类型 方法名称(可选参数信息); // 其他非抽象方法内容 } 1.3 @FunctionalInterface注解 与 @Override 注解的作用类似,Java 8中专门为函数式接口引入了一个新的注解:

Python 面向对象(初级篇)

♀尐吖头ヾ 提交于 2019-12-10 04:00:20
概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 面向过程编程最易被初学者接受,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,即:将之前实现的代码块复制到现需功能处。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 while True : if cpu利用率 > 90 % : #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 if 硬盘使用空间 > 90 % : #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 if 内存占用 > 80 % : #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 随着时间的推移,开始使用了函数式编程,增强代码的重用性和可读性,就变成了这样: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 def 发送邮件(内容) #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 while True : if cpu利用率 > 90 % : 发送邮件( 'CPU报警' ) if 硬盘使用空间 > 90 % : 发送邮件( '硬盘报警' ) if 内存占用 > 80 % : 发送邮件( '内存报警' ) 今天我们来学习一种新的编程方式

学会JavaScript函数式编程(第1部分)

青春壹個敷衍的年華 提交于 2019-12-10 00:23:09
摘要: JS函数式编程入门。 原文: 学会使用函数式编程的程序员(第1部分) 作者: 前端小智 Fundebug 经授权转载,版权归原作者所有。 在这篇由多部分组成的文章中,接下来将介绍函数式编程的一些概念,这些概念对你学习函数式编程有所帮助。如果你已经懂了什么是函数式编程,这可以加深你的理解。 请不要着急。从这一点开始,花点时间阅读并理解代码示例。你甚至可能想在每节课结束后停止阅读,以便让你的观点深入理解,然后再回来完成。 最重要的是你要理解。 纯函数(Purity) 所谓纯函数,就是指这样一个函数,对于相同的输入,永远得到相同的输出,它不依赖外部环境,也不会改变外部环境。如果不满足以上几个条件那就是非纯函数。 下面是Javascript中的一个纯函数示例: var z = 10; function add(x, y) { return x + y; } 注意, add 函数不涉及 z 变量。它不从 z 读取,也不从 z 写入,它只读取 x 和 y ,然后返回它们相加的结果。这是一个纯函数。如果 add 函数确实访问了变量z,那么它就不再是纯函数了。 请思考一下下面这个函数: function justTen() { return 10; } 如果函数 justTen 是纯的,那么它只能返回一个常量, 为什么? 因为我们没有给它任何参数。 而且,既然是纯函数的

Scala函数式编程_function & method

夙愿已清 提交于 2019-12-09 20:03:43
Scala函数式编程_function & method Function 和 Method 传递性上的区别 method——指的是在trait、class、object中以def关键字声明的,它不能被直接传递。 function—— 类型为 ParamsType=>ResultType 的变量,这些变量背后是用 FunctionN 对象来封装的 ,可以被传递。同时,方法也可以转换成函数。 做个测试,如下,启动scala shell, scala> val increase = (x: Int) => x + 1 increase: Int => Int = <function1> scala> val increase = (x: Int) => x + 1 increase: Int => Int = <function1> scala> val add = (x: Int,y: Int) => x + y add: (Int, Int) => Int = <function2> scala> 可以看到, 变量increase(一个匿名函数并赋值给变量),是用 function1 来封装的。其类型为 Int => Int。 如下赋值给变量的匿名函数, scala> val add = (x: Int,y: Int,z: Int) => x + y + z add: (Int,

Redux 中间件与函数式编程

送分小仙女□ 提交于 2019-12-08 21:48:24
为什么需要中间件 接触过 Express 的同学对“中间件”这个名词应该并不陌生。在 Express 中,中间件就是一些用于定制对特定请求的处理过程的函数。作为中间件的函数是相互独立的,可以提供诸如记录日志、返回特定响应报头、压缩等操作。 同样的,在 Redux 中,action 对象对应于 Express 中的客户端请求,会被 Store 中的中间件依次处理。如下图所示: 中间件可以实现通用逻辑的重用,通过组合不同中间件可以完成复杂功能。它具有下面特点: 中间件是独立的函数 中间件可以组合使用 中间件有一个统一的接口 这里采用了 AOP (面向切面编程)的思想。 对于面向对象思想,当需要对逻辑增加扩展功能时(如发送请求前的校验、打印日志等),我们只能在所在功能模块添加额外的扩展功能;或者选择共有类通过继承方式调用,但是这将导致共有类的膨胀。否则,就只有将其散落在业务逻辑的各个角落,造成代码耦合。 而使用 AOP 的思想,可以解决代码冗余、耦合问题。我们可以将扩展功能代码单独放入一个切面,待执行的时候才将其载入到需要扩展功能的位置,即切点。这样的好处是不用更改本身的业务逻辑代码,这种通过串联的方式传递调用扩展功能也是中间件的原理。 从零开发一个中间件 中间件需要有统一的接口,才能实现自由组合。每个中间件必须被定义成一个函数 f1 ,返回一个接收 next 参数的函数 f2 ,而

Python高级语法——函数式编程——学习心得笔记

末鹿安然 提交于 2019-12-08 04:44:54
Python高级语法——函数式编程——学习心得笔记 1. 函数式编程(FunctionalProgramming) 1.1. 基于lambda演算的一种编程方式 程序中只有函数 函数可以作为参数,同样可以作为返回值 纯函数式编程语言:LISP, Haskell Python函数式编程只是借鉴函数式编程的一些特点,可以理解为一半函数式一半Python 常用函数 高阶函数 返回函数 匿名函数 装饰器 偏函数 lambda表达式 函数:最大程度复用代码 存在问题: 如果函数很小很短,则会造成啰嗦 如果函数被调用次数少,则会造成浪费 对于阅读者来说,造成阅读流程的被迫中断 看实例 小函数 lambda表达式(匿名函数) 一个表达式,函数体相对简单 不是一个代码块,仅仅是一个表达式 可以有参数,有多个参数也可以,用逗号隔开 看实例 1.2. 高阶函数 把函数作为参数使用的函数,叫高阶函数 看实例 系统高阶函数 map: 映射 即把集合或者列表中的元素,每一个元素都按照一定的规则进行操作,生成一个新的 列表或者集合 map函数是系统提供的具有映射功能的高阶函数,返回值是一个迭代对象 看实例 reduce: 归并,缩减 把一个可迭代的对象最后归并成一个结果 对于函数参数有要求: 必须有两个参数,必须有返回结果 = 看实例 filter: 过滤函数 对一组数据进行过滤

优化函数式编程:向 PHP 移植 Clojure 函数

柔情痞子 提交于 2019-12-07 21:21:43
许多通用程序设计语言试图兼容大多数编程范式,PHP 就属于其中之一。不论你想要成熟的面向对象的程序设计,还是程序式或函数式编程,PHP 都可以做到。但我们不禁要问,PHP 擅长函数式编程吗?本文系国内 ITOM 管理平台 OneAPM 工程师编译整理。 笔者在今年冬天开始时,在 Recurse Center 致力于学习 Clojure,更加深入地了解了函数式编程,并重新拾起 PHP 的客户端工作。但笔者仍然希望运用一些高阶函数和概念,并对它们进行研究。 笔者已经在 PHP 中实施了 模拟 LISP 语言 ,并看到了一些在 PHP 中通过使用 underscore 类库以兼容某些关键函数方法的尝试。但为了使 Clojure 在写入其它编程语言时仍然保有较高的速度,笔者特意镜像 Clojure 的标准库,以使自己能在编写真正的 PHP 代码时,以 Clojure 的方式思考。虽然在学习的过程中绕了一些弯路,笔者仍然愿意向各位展示自己是如何实现 interleave 函数的。 幸运地是, 已经有人执行了 array_some 和 array_every,并且非常地道(至少笔者这么认为)。 /** * Returns true if the given predicate is true for all elements. * credit: array_every and array