函数式编程的概念

题外话,最近在学习scala和jdk8的时候接触到了函数式编程这一概念,于是学习了下当做笔记。

函数式编程是种编程方式,它将电脑运算视为函数的计算。函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。(摘自百度百科)

上面的太饶,简单来说函数式编程就是一种编程方式或者说思想,以函数为单元来处理业务逻辑,也可作为返回值,不依赖不改变外界状态。

函数为一等公民,以函数为单元完成各种操作,函数是自变量到因变量的一一映射,即一个值到另一个值的映射,结果可作为参数,套来套去的。。它可以将计算描述为表达式求值并避免了状态和数据改变。

使用函数式编程的优缺点

优点:
1.简便,支持闭包和高阶函数,大量使用函数减少重复的代码,简化编程
2.方便代码管理,函数式编程不依赖、也不改变外接状态,只要输入参数返回结果必然相同,这样每个函数作为独立单元更有利于单元测试和除错,以及模块化组合,方便管理。
3.易于并发,因为它不改变变量,无需考虑线程,死锁的问题。

缺点:
1.数据一直不可改变可能长期占用耗费cpu存储资源。
2.经常为了提速度不提供自动边界检查或垃圾回收机制等功能

几个概念

柯里化

在一个函数中首先填充几个参数(然后再返回一个新函数)的技术称为柯里化(Currying),简单来说就是将函数的参数变为一个参数的格式,函数可作为参数。

语法糖

程序可阅读性高,简洁方便的写法,对功能没影响但能更好的实现的语法为语法糖。

纯函数和非纯函数

这里有个纯函数的概念 ,纯函数是给定参数总是返回相同结果,函数的结果不依赖任何隐藏信息或程序执行改变的状态,也不依赖来自I/0装置的任何外部输入,无副作用。

举个栗子,在js中假定数组 var arr = [1,2,3,4,5];

arr.slice(0,2);//执行多少次返回的结果不会变 为纯函数
arr.splice(0,2);//执行两次就改变了返回结果 不纯的函数

非纯的其它例子

java的random() 【内部的随机数可能导致结果可能不一致】

java的printf() 【促使输出到I/O装置,产生副作用】

不变性

不变是指对象创建以后就不再发生变化,比如java.lang.String就是不可变的典型,假如创建了一个String实例,它不会发生变化,就算使用replace对象进行字符串替换,实际上也不会改变原有对象而是函数返回一个新的String对象作为给定字符串替换后的返回值。不变的对象在函数式编程中大量使用。


函数式编程(FP)和命令式编程

函数式编程关心数据的映射,命令式编程关心解决问题的步骤

这里的映射就是数学上“函数”的概念——一种东西和另一种东西之间的对应关系。

它的抽象程度可以很高,这就意味着函数式的代码可以更方便的复用。代码可以简洁。

举个栗子

public class Test1 {
    class User {
        private String name;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }
    public static void main(String[] args) {
        //初始化list数据
        List<User> userList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Test1 t = new Test1();
            User user = t.new User();//实例化内部类
            user.setName("linjw" + i);
            userList.add(user);
        }

        //将list中的name 迁到新的list中

        //命令行方式实现 侧重于怎么做 单独对user操作
        List<String> newUserList1 = new ArrayList<>();
        for (int i = 0; i < userList.size(); i++) {
            newUserList1.add(userList.get(i).getName());
        }
        //函数式实现 不对单个user做操作 侧重于做什么,要完成什么 允许我们表达想要完成什么而不是怎样做,这也是循环的一个缺点,这样可以不用写循环
        //jdk8 新特性 lambda表达式
        List<String> newUserList2 = userList.stream()
                .map(p -> p.getName())
                .collect(Collectors.toList());
        if(newUserList1.equals(newUserList2)) {
            //输出=
            System.out.println("=");
        }
    }
}

函数式编程和面向对象编程(OOP)

面向对象

java是典型的oop语言(从8开始引入基于对象的函数式),面向对象编程思想侧重于对象,传统的面向过程的编程难以解决重用,维护和扩展开的问题,逻辑复杂难懂。

如果说 程序 = 算法+数据结构 那么面向对象的程序 = 基于对象操作的算法+已对象为基础单位的数据结构

它主要是讲构成问题的各个事物分解为对象,

它的三大特性为:继承,封装,多态

面向对象也是基于过程去完成一件事,但是它更侧重于对象和对象可以做什么事。

举个简单的例子,做我喜欢吃的可乐鸡翅
使用面向过程的话大致过程为 我去菜市场买菜 -> 买可乐鸡翅所需的配料 -> 用锅煮
但是如果用面向对象的思维,假设用java实现,
public class OOP {
    class Person {
        public void maicai() {
            System.out.println("人可以买菜,可乐鸡翅配料");
        }
        public void zuocai() {
            //人可以使用锅做菜 先实例化锅
            Guo guo = new Guo();
            guo.zuocai();
        }
    }

    class Guo {
        public void zuocai() {
            System.out.println("锅可以做菜");
        }
    }

    public static void main(String[] args) {
        OOP oop = new OOP();
        Person p = oop.new Person();
        p.maicai();
        p.zuocai();
    }
}

更多的可参考 https://yuedu.baidu.com/ebook/f7c46708a26925c52cc5bff4?pn=1&pa=1

总结

函数编程主要是以单元为格式的编程规范,以函数思维为核心,函数可以作为参数,结果,对象等等。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容