Function(高阶函数式编程)
Function一个可以进行高阶函数式编程的模块。
chain
def chain[a](fs: Seq[(a) ? a]): (a) ? a
把一些列的方法串起来,挨个执行,每个方法的结果,回作为下一个方法的入参
/**定义两个函数*/
def fun1 = (v:Int) => {
val result = v *
println(result)
result
}
def fun2 = (v:Int) => {
val result = v *
println(result)
result
}
//使用
val funs = Seq(fun1,fun2)
Function.chain[Int](funs)() 运行原理:fun1的结果作为fun2的入参
结果打印
const
def const[T, U](x: T)(y: U): T
这是一个返回常量的方法,直接返回 x 值
假如我们要把一个序列中的元素替换成同一个值,可以使用
List(, , , , ).map(_=>)
我们可以用const来处理
List(, , , , ).map(Function.const())
tupled
def tupled[a1, a2, b](f: (a1, a2) ? b): ((a1, a2)) ? b
将二元函数转换为一个一元函数,参数为Tuple2类型
def tupleFunc = (a:Int,b:Int) => {
a+b
}
/**使用*/
val funs = Function.tupled(tupleFunc)
val v = (,)
println(v.getClass.getName)
println(funs(v))
def tupled[a1, a2, a3, b](f: (a1, a2, a3) ? b): ((a1, a2, a3)) ? b
同 tupled[a1, a2, b] def tupled[a1, a2, a3, a4, b](f: (a1, a2, a3, a4) ? b): ((a1, a2, a3, a4)) ? b
同 tupled[a1, a2, b]
def tupled[a1, a2, a3, a4, a5, b](f: (a1, a2, a3, a4, a5) ? b): ((a1, a2, a3, a4, a5)) ? b
同 tupled[a1, a2, b]
def untupled[a1, a2, b](f: ((a1, a2)) ? b): (a1, a2) ? b
def tupleFunc = (v:Tuple2[Int,Int]) => {
v._1 + v._2
}
//转换
val funs = Function.untupled(tupleFunc)
println(funs(,)) /** 8 */
def untupled[a1, a2, a3, b](f: ((a1, a2, a3)) ? b): (a1, a2, a3) ? b
同 tupled[a1, a2, b] def untupled[a1, a2, a3, a4, b](f: ((a1, a2, a3, a4)) ? b): (a1, a2, a3, a4) ? b
同 tupled[a1, a2, b]
def untupled[a1, a2, a3, a4, a5, b](f: ((a1, a2, a3, a4, a5)) ? b): (a1, a2, a3, a4, a5) ? b
同 tupled[a1, a2, b]
uncurried
def uncurried[a1, a2, b](f: (a1) ? (a2) ? b): (a1, a2) ? b
把一个柯里化函数转换为但 2 个参数的函数
/**声明一个柯里化函数*/
def curriedSum = (x:Int)=>(y:Int) => x + y
//转换
val funs = Function.uncurried(curriedSum)
println(funs(,))
结果:
def uncurried[a1, a2, a3, b](f: (a1) ? (a2) ? (a3) ? b): (a1, a2, a3) ? b
同 uncurried[a1, a2, b] def uncurried[a1, a2, a3, a4, b](f: (a1) ? (a2) ? (a3) ? (a4) ? b): (a1, a2, a3, a4) ? b
同 uncurried[a1, a2, b]
def uncurried[a1, a2, a3, a4, a5, b](f: (a1) ? (a2) ? (a3) ? (a4) ? (a5) ? b): (a1, a2, a3, a4, a5) ? b
道理同 uncurried[a1, a2, b]
unlift
def unlift[T, R](f: (T) ? Option[R]): PartialFunction[T, R]
将 A => Option[B] 类型的函数转换为 PartialFunction[T, R] 类型函数
def optionFun(x : Int) = {
println(x)
if (x > ) Some(x*) else None
}
//使用
val funs = Function.unlift(optionFun)
val chars = Array(,,)
//collect需要PartialFunction类型参数
val newchars = chars.collect(funs)
println(newchars.mkString(","))
/**输出为 10,20,30 */
Function(高阶函数式编程)的更多相关文章
- python的高阶函数式编程
首先 函数式编程≠函数编程,就跟计算机≠计算,因为计算机基于硬件,计算基于算法,所以函数式编程是倾向于算法. 高阶函数定义: 一个函数接受的这个参数,而这个参数也是一个函数,称之为高阶函数 例如: ...
- python高阶函数式编程
from functools import reduce def str2int(s): def fn(x, y): return x * 10 + y def char2num(s): return ...
- guava function and predicate 函数式编程
@Test public void function(){ List<String> list = Lists.newArrayList("1","2&quo ...
- Python---进阶---函数式编程---按照权重排序
一. 权重是100 价格占的权重是40%,销量占的权重是17%,评级站的权重是13%,评论占的权重是30% ---------------------------------------------- ...
- Python---进阶---函数式编程---lambda
一. 利用map()函数,把用户输入的不规范的英文,变成首字母大写,其他小写的规范的名字:比如说["ADMAm", "LISA", "JACK&quo ...
- Python修饰器的函数式编程
Python的修饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的Decorator搞混了,其实这是完全不同的两个东西.虽然好像,他们要干的事都 ...
- swift之函数式编程(四)
文章内容来自<Functional Programing in Swift>,具体内容请到书中查阅 Map, Filter, Reduce Functions that take func ...
- Scala学习教程笔记三之函数式编程、集合操作、模式匹配、类型参数、隐式转换、Actor、
1:Scala和Java的对比: 1.1:Scala中的函数是Java中完全没有的概念.因为Java是完全面向对象的编程语言,没有任何面向过程编程语言的特性,因此Java中的一等公民是类和对象,而且只 ...
- 从函数式编程到Promise
译者按: 近年来,函数式语言的特性都被其它语言学过去了.JavaScript异步编程中大显神通的Promise,其实源自于函数式编程的Monad! 原文: Functional Computation ...
随机推荐
- XSS的原理分析与解剖:第四章(编码与绕过)*******************未看**********************
0×01前言 很抱歉,这第四章被我推了几个月,今天是元旦难得有空,就把第四章写下.我先把主要使用的编码说下,介绍完会说下绕过. 本文建议与<杂谈如何绕过WAF>一同阅读. 0×02 URL ...
- STM32嵌入式开发学习笔记(四):使用滴答计时器实现精准计时
前面我们讲过,因为在STM32上没有系统时间的接口,因此无法调用sleep函数,在本文中,笔者将利用滴答计时器实现精准延时. 查阅技术手册,滴答计时器依赖于一个SysTick_Type类型寄存器,定义 ...
- windows网络函数
The following functions are used in Windows networking: MultinetGetConnectionPerformance WNetAddConn ...
- 『Golang』—— 标准库之 os
Golang 的 os 库基本承袭 Unix 下 C 语言的用法 path 库: func Base(path string) string //取文件名,不含目录部分 func Dir(path s ...
- VC++ 2010 创建高级Ribbon界面详解(4)
5.辅助控件 除了前面我们介绍的按钮,工具栏,编辑框等基本控件外,为了支持现代软件对丰厚的界面交互方式的要求,Visual Studio 2010还提供了很多其他的辅助控件,例如我们通常会用到的“上一 ...
- JUC源码分析-集合篇(九)SynchronousQueue
JUC源码分析-集合篇(九)SynchronousQueue SynchronousQueue 是一个同步阻塞队列,它的每个插入操作都要等待其他线程相应的移除操作,反之亦然.SynchronousQu ...
- es概念一句话简介和注意点
1.elasticsearch是什么? 一个实时分布式搜索(全文or结构化)和分析引擎,面向文档(document oriented) 2.主节点(Master Node)职责? 负责集群中的操作(如 ...
- Python 内置函数&filter()&map()&reduce()&sorted()
常用内置函数 Python 2.x 返回列表,Python 3.x 返回迭代器 在进行筛选或映射时,输出的结果是一个数组,需要list帮助. 如:print(list(map(lambda x:x+1 ...
- docker Dcokerfile学习---构建nginx环境
1.创建项目目录并上传包 $ mkdir docker_nginx $ cd docker_nginx 下载nginx包 $ wget http://nginx.org/download/nginx- ...
- 关于vsphere exsi安装时遇到的问题
我在虚拟机上安装vsphere 6.0的时候,在安装的过程中报错,出现了如下的内容. Error loading /tools.t00 Compressed MD5: Decompressed MD5 ...