函数式编程

scala之函数式编程

杀马特。学长 韩版系。学妹 提交于 2019-11-27 15:10:53
1、偏函数 ① 基本介绍 在 对符合某个条件,而不是所有情况进行逻辑操作时 ,使用偏函数是一个不错的选择 ② 示例 给你一个集合val list = List(1, 2, 3, 4, “abc”) ,请完成如下要求: 将集合list中的所有数字+ 1,并返回一个新的集合 要求忽略掉 非数字 的元素,即返回的 新的集合 形式为 (2, 3, 4, 5) object PartialFunDemo02 { def main(args: Array[String]): Unit = { //使用偏函数解决 val list = List(1, 2, 3, 4, "hello") //定义一个偏函数 //1. PartialFunction[Any,Int] 表示偏函数接收的参数类型是Any,返回类型是Int //2. isDefinedAt(x: Any) 如果返回true ,就会去调用 apply 构建对象实例,如果是false,过滤 //3. apply 构造器 ,对传入的值 + 1,并返回(新的集合) val partialFun = new PartialFunction[Any,Int] { override def isDefinedAt(x: Any) = { println("x=" + x) x.isInstanceOf[Int] } override def

函数式编程中的函数—函数式编程的多态

♀尐吖头ヾ 提交于 2019-11-27 13:37:44
函数式编程中的函数—函数式编程的多态 保存了计算上下文和计算过程的特殊值 保存了计算上下文和计算过程的有输入输出的可计算结构。 保存了计算上下文和计算过程的可配置结构;(柯里化)。 函数作为一种特殊的值和结构,可以由更高阶的函数对其进行组合、变换、柯里化等操作; 函数作为输入和输出:本质上都是可配置、可计算结构。 可配置的是作为参量输入的计算上下文; 可计算是计算上下文配置完备后直接进行计算; 普通函数; 参数函数(闭包函数); 高阶函数; 返回函数(内部函数); 值函数:被其它函数引用和调用的函数; 上下文函数:给值函数提供上下文(参量)的函数。 函数:需要初始化的可求值结构; 函数变量:需要二阶初始化的可求值变量 1、求值结构初始化;函数绑定; 2、求值上下文初始化;参数变量绑定; 函数作为返回值的函数的解析 1、定义函数变量,引用函数返回值; 2、对函数变量进行上下文初始化,执行求值; 形参上下文: 函数内部对其它函数的引用,一部分是通过形参初始化的; 编译器会对所有的基础函数:不管是内部还是外部的进行编译存储。 函数式编程中可变的是同一签名下,不同实现的函数的可替代性。 基础函数:函数式编程中所有的不可变的函数; 组合函数:通过不可变的函数结合而成的函数。 组合函数的调用入口仍然是基础函数; 函数式编程的多态: 同一个基础函数与不同的其它函数组合,会有不同的行为形式。 来源

函数式编程之构建--待完成

与世无争的帅哥 提交于 2019-11-27 13:37:41
函数式编程之构建 一、平凡函数与compose、pipeline 前后计算以来的平凡函数对函数签名有要求; 函数签名的逻辑顺序必须兼容; 二、高阶函数: 1、作为构建节点; 2、作为构建器具; 三、monad与计算上下文: 来源: https://www.cnblogs.com/feng9exe/p/11365992.html

函数式编程中的组合子

断了今生、忘了曾经 提交于 2019-11-27 13:37:36
https://segmentfault.com/a/1190000016803036#articleHeader11 什么是组合子 组合子 在数学中就有,但我们讲的并不是数学中的定义,而是在JavaScript领域中的 组合子 概念。按照我所理解的 JavaScript函数式编程 ,我将 组合子 分为 辅助组合子 和 函数组合子 。后续我们会对这两种 组合子 进行区别。 组合子 (全称: 组合子函数 )又称之为 装饰器函数 ,用于转换函数或数据,增强函数或数据行为的 高阶函数 。这里我们提到的 高阶函数 并不陌生,所谓的 高阶函数 ,就是以函数为参数或者返回值的函数。 辅助组合子 是最为简单的组合子,它是具有数据流程控制的 抽象函数 。而 函数组合子 就很特别了,它必须以 函数 (称之为 原函数 或 契函数 )为参数,其大致有如下特点: 函数组合子 本身就是 高阶函数 ; 不改变 原函数 ( 契函数 )的最终意图; 能增强 原函数(契函数) 的行为; 来源: https://www.cnblogs.com/feng9exe/p/11365990.html

swift函数式编程之compose

隐身守侯 提交于 2019-11-27 13:33:09
func a(en:String) -> String { return en + "a"; } func b(en:String) -> String { return en + "b"; } func c(en:String) -> String { return en + "c"; } func pipeLineGo(en:[(String) -> String ])->(String)->String{ func innerFunc(px:String)->String{ return en.reduce(px, { (px, fn) -> String in return fn(px); }) } return innerFunc; } let ret = pipeLineGo(en: [a,b,c]); let result = ret("ddd"); 来源: https://www.cnblogs.com/feng9exe/p/11365865.html

函数式编程常用核心概念

ぃ、小莉子 提交于 2019-11-27 10:19:45
•纯函数 •函数的柯里化 •函数组合 •Point Free •声明式与命令式代码 •核心概念 1.纯函数 什么是纯函数呢? 对于相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用,也不依赖外部环境的状态的函数,叫做纯函数。 举个栗子: 1 2 3 4 5 var xs = [1,2,3,4,5]; // Array.slice是纯函数,因为它没有副作用,对于固定的输入,输出总是固定的 xs.slice(0,3); xs.slice(0,3); xs.splice(0,3); // Array.splice会对原array造成影响,所以不纯 xs.splice(0,3);    2.函数柯里化 传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。 我们有这样一个函数checkage: 1 var min = 18; <br> var checkage = age => age > min;    这个函数并不纯,checkage 不仅取决于 age还有外部依赖的变量 min。 纯的 checkage 把关键数字 18 硬编码在函数内部,扩展性比较差,柯里化优雅的函数式解决。 1 2 3 var checkage = min => (age => age > min); var checkage18 = checkage(18); // 先将18作为参数

函数式编程、函数式接口、兰姆达表达式、方法引用、stream

耗尽温柔 提交于 2019-11-27 03:40:01
package com.example.demo; import org.assertj.core.util.Lists; import javax.sound.midi.SysexMessage; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.function.Consumer; import java.util.stream.Collectors; import java.util.stream.Stream; /** * 参考:https://blog.csdn.net/EQuaker/article/details/86561781 * https://www.cnblogs.com/yunqing/p/9221117.html * 1. 函数式编程:(两个特点) * 可以把函数作为参数传递给另一个函数,也就是所谓的高阶函数 * 可以返回一个函数,这样就可以实现闭包或者惰性计算(闭包:A函数返回B函数,B函数使用了A中的变量,则相当于扩大了A中变量的作用范围;放回方法,可以延迟执行) * 2. 函数式接口(只有一个抽象方法,可以有多个默认实现方法或静态方法) * Consumer<T>:消费性接口 * Supplier<T> 供给型接口

函数式编程

爷,独闯天下 提交于 2019-11-26 14:43:59
纯函数: 函数的返回结果只依赖于它的参数; 函数在执行过程中没有其他副作用; 函数式编程两个最基本运算: 合成:如果一个值要经过多个函数才能变成另一个值,那就可以把中间步骤合并成一个函数; 柯里化:有多个参数的函数转为单个参数的函数; 函数式编程特点: 函数是“第一等公民”; 只用表达式,不用语句; 无副作用(函数内部不会与外部互动产生运算以外的结果); 不修改状态; 引用透明(任何时候只要参数相同,引用函数所得到的返回值总是相同的); 转载于:https://www.cnblogs.com/colima/p/8926125.html 来源: https://blog.csdn.net/weixin_30507269/article/details/98889810

Java8函数式编程(二):类比Spark RDD算子的Stream流操作

狂风中的少年 提交于 2019-11-25 23:04:12
1 Stream流 对集合进行迭代时,可调用其iterator方法,返回一个iterator对象,之后便可以通过该iterator对象遍历集合中的元素,这被称为外部迭代(for循环本身正是封装了其的语法糖),其示意图如下: 除此之外,还有内部迭代方法,这正是这里要说明的集合的stream()方法返回的Stream对象的一系列操作,比如,要统计一个数字列表的偶数元素个数,当使用Stream对象的操作时,如下: List<Integer> list = new ArrayList<Integer>(){{ add(1); add(2); add(3); }}; long count = list.stream().filter(num -> num % 2 == 0).count(); System.out.println(count); // 1 其示意图如下: 上面提供的例子,比如filter,其参数为一个lambda表达式,所以Stream其实是用函数式编程方式在集合类上进行复杂操作的工具。 2 Stream流操作与Spark RDD算子 其实有Spark经验的人开始使用Stream流操作时,会有似曾相识的感觉,好像一切都那么熟悉。 参考Spark RDD算子介绍的文章:《Spark RDD算子实战》 https://blog.51cto.com/xpleaf/2108481