• 函数式编程


    这几年大数据很火,在java中,有一个它的代名词hadoop,它的编程模型叫做MapReduce

    什么是MapReduce呢,想象下有个图书馆,里面有十排书架,我想统计下有多少书,需要一个个数,如果用更快的方式怎么做。

    • 找十个人,每人数一排;
    • 将每个人的结果求和;

    用MapReduce写一下这个问题

    首先定义两个方法 map reduce

    map() //对数据执行分批并行操作
    reduce() //对操作所有返回值求结果
    

    然后是数书的操作定义两个方法

    countBook() //数一排书
    sum()//求和
    

    那么这次数书操作可表示为

    map(countBook()).reduce(sum())
    

    ok,再进一步,现在我们有了map,reduce两个方法,下面可以进行花式数书了,我想统计下数学书

    定义方法

    countMathBook();
    

    你会很快写出

    map(countMathBook()).reduce(sum());    
    

    但是,我们需要拥抱变化,所以现在需求变了,我想知到十个书架中,书最多的书架的是哪一个

    因此方法在此

    max() //求最大值
    
    map(countBook()).reduce(max())
    

    然后需求又变了我想知到十个书架中,数学书最多的书架的是哪一个

    现在不需要考虑了

    map(countMathBook()).reduce(max())
    

    我想要求最小的呢

    map(countBook()).reduce(min())
    

    我想要求红色书的数量呢

    map(countRedBook()).reduce(sum())
    

    花式数书结束,现在我们可以回答下什么是函数式编程了。

    首先map,reduce本身不是这次数书所定义的业务方法,而是语言比如java的jdk自带的api,java8之后,在原有的函数库中,新增了许多像map,reduce这样抽象的方法,或者说函数,我们更愿意称之为高阶函数,这些抽象的方法可以为我们屏蔽底层的运算细节。

    比如怎么分批数书,我们不需要考虑怎么分批数,只要传入一批怎么数的函数就行。也不要在意求和的过程,只要传入求和的函数。

    所以,函数式风格的编程就可以这么定义。

    • 将业务逻辑细化,抽象,封装成一个个功能函数,并借助语言自带的高阶函数api,将整个业务流程转化为函数之间的相互调用,这就是函数式编程。

    我们可以看到,函数式编程中,函数不仅直接调用,也可以当成参数被其他函数调用。
    因此,进一步,如果我不仅想把函数当参数,还想传入值,所以再封装一下,函数和值封装后是什么。

    • 函数->行为
    • 值->属性

    没错就是这就是对象

    • 将业务逻辑细化,抽象,封装成一个个对象,并借助语言,库,组件,框架等,将整个业务流程转化为对象之间的相互调用,这就是面向对象编程。

    因此,这么看来,函数式跟面向对象的思想其实都是一致的,即对逻辑的抽象与封装。

    原点

    回顾下语言的历程

    过程式->函数式->面向对象

    近年来大数据的兴起,数据的处理往往跟面向对象没关系,更多的是简单而大量的数据结构,借助mapreduce这样的高阶函数处理更加方便,这也是函数式编程又火起来的原因。

    程序只不过是回到了它的原点:

    算法+数据结构->函数+高阶函数+数据。

  • 相关阅读:
    设计模式03-工厂方法
    设计模式02-抽象工厂
    设计模式01-什么是设计模式
    工作流activiti-03数据查询(流程定义 流程实例 代办任务) 以及个人小练习
    工作流activiti-02事物控制、流程引擎创建
    工作流activiti-01个人小结
    jQuery.extend 函数详解
    hibernate框架学习之数据查询(QBC)
    hibernate框架学习之多表查询helloworld
    hibernate框架学习之数据查询(HQL)helloworld
  • 原文地址:https://www.cnblogs.com/wang-jee/p/10448180.html
Copyright © 2020-2023  润新知