- unary 函数
接收一个函数,将它的参数长度变为 1。比如 parseInt 接收两个参数,因此使用 map 方法会发生错误。这时候就是它的用武之地了
`const unary = (fn) => {
return fn.length === 1 ? fn : arg => fn(arg)
}`
- once 函数
接收一个函数。顾名思义,就是该函数只能运行一次,比如支付等场景下
`// ES6
const once = (fn) => {
let done = false;
return function(){
return done ? undefined 😦(done = true),fn.apply(this,arguments));
}
}`
- memoized 函数
接收一个函数,返回一个函数,每次调用的结果先在 cache 中找,如果找不到再调用原函数。
`// ES6
const memoized = (fn) => {
const cache = {}
return (arg) => cache[arg] || (cache[arg] = fn(arg))
}
// ES5
var memoized = function(fn){
var cache = {}
return function(arg){
return cache[arg] || (cache[arg] = fn(arg))
}
}`
具体可以参考 函数式编程之闭包与高阶函数
第五章 数组的函数式编程
首先我们介绍了投影的概念,即传入值并返回值的函数称为投影函数,比如 map。然后我们简单实现了 map,filter,concatAll,reduce 和 zip 函数
- map 函数
`const map = (array, fn) => {
let results = [];
for(let value of array){
results.push(fn(value))
}
return results
}`
- filter 函数
`const filter = (array, fn) => {
let results = [];
for(let value of array){
fn(value) ? results.push(fn(value)) : undefined
}
return results
}`
- concatAll 函数
concatAll 函数主要用于数组的扁平化
`const concatAll = (array,fn) => {
let results = []
for(let value of array){
results.push.apply(results,value);
}
return results
}`
- reduce 函数
`// 值默初始值认为 0 的实现
const reduce = (array,fn) => {
let accumlator = 0;
for(let value of array){
accumlator = fn(accumlator,value)
}
return accumlator
}
// 带初始值实现
const reduce = (array,fn,initial) => {
let accumlator;
if(initial != undefined){
accumlator = initial;
}else{
accumlator = array[0];
}
if(initial === undefined){
for(let i = 1; i < array.length; i++){
accumlator = fn(accumlator,array[i])
}
}else{
for(const value of array){
accumlator = fn(accumlator,value)
}
}
return [accumlator];
}`
- zip 函数
zip 函数主要是用于合并两个给定的数组。如{ id:1,name:'zhangsan' } {id:1,age:'20'}
,合并成 { id:1,name:'zhangsan',age:'20'}
。它接受三个参数,前两个分别是两个待合并的数组。最后一个是作用于这两个数组的函数。
`const zip = (leftArr,rightArr,fn) => {
let index,results = [];
for(index = 0;index < Math.min(leftArr.length,rightArr.length); index++){
results.push(fn(leftArr[index],rightArr[index]));
}
return results;
}`
具体可以参考 函数式编程之数组的函数式编程
第六章 柯里化与偏应用
本章中我们了解了柯里化与偏应用的基本概念,并实现了柯里化与偏函数。它们主要是用来减少函数的参数的。
- 柯里化
柯里化是一个把多参数函数转换为一个嵌套的一元函数的过程。具体的实现过程如下
`const curry = function(fn){
return function curried(…args){
if(args.length < fn.length){
return function(){
return curried.apply(null,args.concat(arguments));
}
}else{
return fn.apply(null,args)
}
}
}`
- 偏应用
偏应用是为了弥补柯里化不足的地方产生的。柯里化的参数只能从前往后传,而偏函数的参数可以空出任意位置的参数。具体实现如下
`const partial = (fn,…partialArgs){
let args = partialArgs
return (…fullArgs) => {
let arg = 0;
for(let i = 0; i < args.length && i < fullArgs.length; i++){
if(args[i] === undefined){
args[i] = fullArgs[arg++]
}
}
return fn.apply(null,…args);
}
}`
具体可以参考 函数式编程之柯里化与偏应用
第七章 组合与管道
这一章我们由 unix 系统的管道符引出函数式编程中的组合与管道。并且了解到了函数式编程遵循结合律。因此我们可以在 compose 和 pipe 函数中任意组合函数,并且最后得到的结果都是一样的。这就能让我们组合出无数种函数。这一节最重要的是 compose 和 pipe 函数。
- compose 函数
compose 函数主要是用于将多个函数组合成一个函数
`const compose = (fns) => {
return function(value){
let fnsCopy = fns.concat(); // 还记得我们发现的 bug 吗
fnsCopy.push(value);
return fnsCopy.reverse().reduce((acc,fn)=>{
return fn(acc);
})
}
}`
- pipe 函数
pipe 函数其实和 compose 函数一样,只是方向的区别。compose 函数是从后往前,pipe 函数是从前往后,仅此而已。
`const pipe = (fns) => {
return function(value){
let fnsCopy = fns.concat();
fnsCopy.unshift(value);
return fnsCopy.reduce((acc,fn)=>{
return fn(acc);
})
}
}`
具体可以参考 函数式编程之组合与管道
第八章 函子
这一章我们从如何使用函数式编程的思想处理异常开始,引出了函子的概念。函子其实就是一个普通的对象,但是它实现了 map 方法,在遍历每个值的时候会返回一个新的值。并且如果函子带有 of 方法的话就是一个 pointed 函子(例如 ES6 数组新增了 Array.of 方法,且具有 map 方法,所以它本身就是一个 pointed 函子)。然后我们介绍了两个重要的函子 MayBe 函子和 Either 函子,并以掘金的文章为例展示了函子处理的过程。
- 普通函子
`const Container = function(value){
this.value = value;
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
[外链图片转存中…(img-ttsEEzaM-1715834993832)]
[外链图片转存中…(img-frNASVdS-1715834993832)]
[外链图片转存中…(img-9j1feqj4-1715834993833)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!