入门函数式编程

Java入门6: 函数式编程 Lambda 函数式编程 阅读详情

1. 什么是函数式编程

最开始出现的是命令式编程,就是面向过程的编程,把问题按照步骤一步一步来执行,强调的是怎么去做。这样会产生很多临时变量,而且代码复用率不高

随后就出现了面向对象编程和函数式编程,面向对象编程这就不过多介绍,而函数式编程它着眼点在函数,而不是过程,它强调的是需要去做什么,如何通过函数的组合变换去解决问题

函数实际上是一个关系,或者说是一种映射,而这种映射关系是可以组合的,一个函数的输出类型可以匹配另一个函数的输入,所以在编程过程中要关注如何去构建关系

2. 函数式编程的特点

2.1 函数是“一等公民”

函数是“一等公民”这是函数式编程得以实现的前提,因为基本的操作都是在操作函数,这就意味着函数与其他数据类型一样处于平等地位,可以赋值给其他变量,也可以作为参数传入另一个函数,或者作为别的函数的返回值

2.2 声明式编程

函数式编程大多数是在声明需要做什么,而不是怎么去做,这样的编程风格就称为声明式编程,它描述了一系列的操作,但不会暴露它们是如何实现的或数据流如何传过它们

好处就是代码可读性高,不用关心具体的实现,方便分工协作

我们熟知的 SQL 语句就是很典型的声明式编程,它由一个个描述查询结果应该是什么样的断言组成,对数据检索的内部机制进行了抽象

2.3 惰性执行

惰性执行就是函数只在需要的时候才执行,即不产生中间变量

函数式编程和命令式编程区别就在于几乎没有产生中间变量,从头到尾都在写函数,只在最后的时候才调用

2.4 无状态和数据不可变

这是函数式编程的核心概念:

数据不可变:要求所有的数据都是不可变的,意味着如果想要修改一个对象就应该创建一个新的对象来修改,而不是修改已有的对象

无状态(引用透明):给定相同的输入,给出相同的输出,不依赖外部状态的变化

为了实现这个目标,函数式编程提出函数应该具备的特性:没有副作用和纯函数

2.5 没有副作用

副作用:在完成函数主要功能之外完成的其他副要功能

在函数中最主要的功能就是根据输入返回结果,最常见的副作用就是随意修改外部变量

保证函数没有副作用:

  • 保证数据的不可变性
  • 避免因为共享状态而带来的问题

2.6 纯函数

纯函数算是“没有副作用”的要求上更进一步,它就是简单的两点:

  • 不依赖外部状态(无状态):函数的运行结果不依赖全局变量、this 指针、IO 操作等

  • 没有副作用(数据不变):不修改全局变量,不修改入参

纯函数就是真正意义上的“函数”,意味着相同的输入,永远会得到相同的输出


纯函数的好处:

  • 便于测试和优化,符合测试驱动开发 TDD 的思想
  • 可缓存性:因为相同的输入总是会返回相同的输出,我们就可以提前缓存函数的执行结果
  • 更少的 bug

3. 常见函数式概念

3.1 柯里化 - currying

柯里化就是将使用多个参数的一个函数拆分成一系列使用一个参数的函数 (将多元函数转换成一元函数)

函数表达:f(a, b, c) => f (a) (b) (c)

//原始的加法函数add
function add(x, y, z) {
  return x + y + z;
}

// 改成柯里化函数
function curriedAdd(x) {
  return function(y) {
    return function(z) {
      return x + y + z;
    };
  };
}
curriedAdd(1)(2)(3) // 6

手写实现柯里化:

// 定义柯里化函数
const curry = (fn) => {
    return function curryFunc(...arg) {
        if (arg.length < fn.length) {
            return function () {
                return curryFunc.apply(null, [...arg, ...arguments]);
            };
        }
        return fn.apply(null, arg);
    }
};
const func = (a, b) => console.log(a - b);
curry(func)(1)(2)

3.2 组合 - compose

组合 compose 指的是将多个函数组合成一个函数,这样一个函数的输出就可以作为另一个函数的输入,从而实现多个函数的链式调用

函数表达:compose(f, g, t) => x => f(g(t(x)),进一步结合 curry 可以实现 compose(f)(g)(t) => x => f(g(t(x)),执行顺序式从右至左执行的

3.3 管道 - pipe

管道 pipe 函数是一个高阶函数,它接受一系列函数作为参数,将函数串联起来,一步步将上一步的输出作为下一步的输入

函数表达:pipe(f, g, t) => x => t(g(f(x)),进一步结合 curry 可以实现 pipe(f)(g)(t) => x => t(g(f(x)),执行顺序式从左至右执行的

组合和管道功能是一样的,本质没什么区别,只是执行顺序不一样

Java函数式编程入门指南 在Java中,函数式编程已成为一种强大的编程风格,它提供了许多有用的功能和工具来简化开发过程。本文将介绍Java函数式编程的基本概念,并提供一些示例代码来帮助你入门。本文介绍了Java函数式编程的基本概念,包括Lambda表达式、函数式接口、方法引用和流式编程。函数式接口是只包含一个抽象方法的接口。在Java函数式编程中,函数式接口扮演着重要的角色,因为它们可以用作Lambda表达式的类型。包,其中包含许多预定义的函数式接口,以满足不同的需求。在上面的示例中,我们首先创建了一个包含整数的列表。 阅读详情

相关推荐

函数式编程入门指南

函数式编程(Functional Programming)是一种编程范式,它强调将计算视为函数求值的过程,并避免改变状态和可变数据。本文将介绍函数式编程的基本概念,并提供一些示例代码来帮助你入门函数式编程。通过使用函数作为一等公民、不可变性、高阶函数、递归和函数组合,函数式编程可以帮助我们编写更清晰、可维护和可扩展的代码。,返回一个新的列表,包含原始列表中的元素和新的值。函数组合在一起,通过函数组合实现了计算平方根并加倍的操作。保持不变,而函数返回的是一个新的列表。函数使用递归的方式计算阶乘。

syntax_loop446的博客 84

函数式编程从入门到精通

Lambda是JDK8中一个语法糖。他可以对某些匿名内部类的写法进行简化。它是函数式编程思想的一个重要体现。让我们不用关注是什么对象。而是更关注我们对数据进行了什么操作。不关注类名和方法名,只关注参数(数据)和方法体(操作Java8的Stream使用的是函数式编程模式,如同它的名字一样,它可以被用来对集合或数组进行链状流式的操作。可以更方便的我们对集合或数组操作。我们在编写代码的时候出现最多的就是空指针异常。所以在很多情清况下我们需要做各种非空的判断。if(author!=null) {

qq_63589255的博客 977

35、Java NIO与函数式编程入门

本文介绍了Java NIO的基础知识及其在高效文件和网络I/O操作中的应用,包括FileChannel的使用、并发访问控制和文件锁定机制。同时,还探讨了Java 8引入的函数式编程特性,如Lambda表达式、函数式接口、方法引用和流(Streams),并通过具体示例展示了如何利用这些特性编写简洁、灵活和高效的代码。最后,文章对Java NIO和函数式编程的核心知识点进行了总结,并提供了适用场景的指导建议。

3a9bq4r8t2y的博客 74

Haskell函数式编程入门教程

Haskell函数式编程入门教程 去发现同类优质开源项目:https://gitcode.com/ 欢迎来到Haskell函数式编程入门教程的下载仓库!这里为您提供了《Haskell函数式编程入门》的学习资源,由张淞编著。 《Haskell函数式编程入门》是一个专为初学者设计的教程,旨在帮助您快速掌握Haskell编程语言的基本概念与技巧。通过本教程的学习,您将逐步理解函数式编程的核心思想,并学会...

gitblog_06716的博客 374

函数式编程入门指南:探索JavaScript函数式编程世界

在实际开发中,还有许多其他有用的函数式编程概念和工具可以探索,例如函数组合、柯里化、函数式的错误处理等。你可以将函数分配给变量,将函数作为参数传递给其他函数,或者从函数中返回另一个函数。通过理解函数是一等公民、纯函数、高阶函数和不可变性,你已经迈出了学习函数式编程的第一步。在函数式编程中,纯函数是一种没有副作用并且对于相同的输入始终产生相同结果的函数。祝你在JavaScript函数式编程的世界中取得成功!函数接受一个数组和一个转换函数作为参数,然后将转换函数应用于数组中的每个元素,并返回结果数组。

database_bug768的博客 132

【知识点总结】电路原理 第一讲

大家好,从今天起,我将开始更新自上大学以来所学到的各种知识,之所以选择更新它们是因为最近我一直在收拾整理自己自上大学以来所收获到的各种知识,看着那厚厚一沓的书本心里不由得犯愁。如果我想找到特定的知识,那岂不是得翻到猴年马月。俗话说得好,下雨天打鞋子,闲着也是闲着,为此我设置一个专栏,将知识点一一分类总结,目的在于更好的整理所学的知识。本人学艺不精,有一些知识点地方可能存在瑕疵,希望各位大佬可以多多指教。以下是本篇文章正文内容虚断:一般通用性运算放大器的正反向输入端之间的电阻非常非常的大。

weixin_51130221的博客 4万+

Java函数式编程入门:核心概念与基础

函数是一等公民:函数可以赋值给变量,作为参数传递,作为返回值不可变性:数据一旦创建,不应被修改无副作用:函数不应修改外部状态声明式:关注"做什么"而非"怎么做"Java 8引入了对函数式编程的支持,使Java开发者能够编写更简洁、更易于维护的代码。

m0_65382359的博客 787

From Manual to Magic: How nnU-Net is Revolutionizing Biomedical Image Segmentation Without Human Int

本文探讨了nnU-Net如何通过全自动深度学习技术革新生物医学图像分割领域。作为自我配置的智能系统,nnU-Net无需人工干预即可完成从数据预处理到模型训练的全流程,显著提升医学影像分割的效率和精度,尤其在CT和MRI影像分析中表现卓越。

metal的博客 1085

【好书推荐】JavaScript Es8 函数式编程实践入门

● 探讨函数式编程的概念,如字符串填充和异步函数● 解析如何在JavaScript中处理函数● 创建一个函数库来模拟underscore.js● 深入探讨ES8的新特性,如扩展运算符和Generator● 遵循函数范式,创建一个工作方式类似于react-redux模式的库购书直达。

编码世界 1万+

【2023版】基于JT808/JT1078协议的车载视频监控平台开发实战-开源架构解析

本文详细解析了基于JT808/JT1078协议的车载视频监控平台开发实战,涵盖协议核心作用、开源架构设计、开发避坑指南及二次开发建议。重点介绍了JT1078协议在音视频传输中的优化方案,以及海量位置数据存储、高可用架构等关键技术点,为开发者提供全面的实战参考。

weixin_26965807的博客 237

第3章 zynq MII转GMII的配置和EMIO UART0的配置

本文介绍了在Vivado工程中实现MII转GMII接口适配的过程,同时配置EMIO UART0接口。主要内容包括:修改PS IP核添加UART0接口,使用concat IP核进行信号整合,调整GMII信号引脚连接,添加约束文件定义引脚映射,并最终生成bit流文件。通过详细的操作截图和TCL约束代码,展示了从硬件配置到生成可编程文件的完整流程,为Zynq平台开发提供了实用参考。

qq_36517072的博客 903

Scala入门指南之函数式编程

集合的基础介绍完之后,就可以来说函数式编程了。Java8也支持了函数式编程,只不过在实际工作中还是用的比较少的。所谓函数式编程,就是把函数作为一个参数传入方法中,在方法中调用这个函数。这样做的好处是,可以提高代码的复用性,在定义方法的时候只定义了函数入参的接收类型和返回类型,但是并没有指明函数具体的操作,由调用方定义具体的操作。打个最简单的比方,如果我们现在要写一个计算器类,正常的方式是定义四个方法,加减乘除,然后在调用的时候,分别使用。如果采用了函数式编程的方法,就可以定义一个方法,他接收两个数字,再接收

123 415

绘制Winform动态折线图,LiveCharts如何打造数据可视化神器?

在C# Winform应用程序中,使用LiveCharts库来创建动态、美观的折线图不仅能够提升用户体验,还能直观展示数据趋势。下面,我们将通过一个详尽的示例,展示如何在Winform项目中集成LiveCharts并绘制折线图。:在Visual Studio中,选择“文件” > “新建” > “项目”,然后选择“Windows Forms 应用(.NET)”模板。LiveCharts的强大之处在于其高度的可定制性,你可以根据需求调整颜色、动画效果、交互方式等,让图表更加符合你的应用需求。

java专栏 1683

java 函数式编程_大数据入门:Scala函数式编程

在大数据的学习当中,学到Spark部分,就免不了需要Scala这门语言了,Scala是Spark框架的原生编程语言,想要真正把Spark搞懂,那么对Scala自然也需要相应程度的掌握。今天的大数据入门分享,我们就来讲讲Scala函数式编程。提到Scala,首先会提到的一个概念,就是函数式编程,这也是Scala语言区别与其他编程语言的典型特征。Scala是一门多范式(multi-paradigm)的...

weixin_39768371的博客 129

科技英语/专业英语——改错总结【2】

1.固定句式 make it + adj + 句子 例:These features make the electronic systems difficult to intercept this kind of signal. 正确形式:These features make it  difficult for the electronic systems  to intercept

MISAYAONE的博客 1732

初探802.11协议(6)——Wi-Fi 6新特性简介

Wi-Fi 6新机制(特性)介绍

FanFF的博客 1522

探索纯函数式编程之美:Haskell入门指南

探索纯函数式编程之美:Haskell入门指南 该项目由在GitCode上分享,是一份详细的Haskell语言入门教程。Haskell是一种强大的、静态类型的、纯函数式的编程语言,它为开发者提供了构建高效、可靠和可维护软件的新视角。 项目简介 **** 是一份适合初学者的Haskell教程,涵盖了基本概念、类型系统、模式匹配、Monads等核心主题。项目以Markdown格式编写,易于阅读,并且包含...

gitblog_00073的博客 411

【WiFi】T830 MT7992 WMM测试修改操作说明

WiFi WMM(Wi-Fi Multimedia)是Wi-Fi联盟推出的一项技术,用于优化无线网络中的多媒体内容传输。WMM通过优先处理不同类型的数据流来改善网络性能,特别是在网络拥堵时。:WMM通过提供服务质量支持,确保语音、视频和其他多媒体应用在无线网络中获得优先处理。这有助于减少延迟和抖动,改善用户体验。:WMM将数据流分为四个优先级队列:语音、视频、最佳效果(Best Effort)和背景(Background)。语音和视频流通常被赋予更高的优先级,以确保它们在网络中得到及时传输。

wgl307293845的博客 1022

Java函数式编程入门

函数式编程在Java中不仅能提高代码的简洁性和可读性,还能在处理数据流、并行计算等场景中发挥重要作用。通过掌握Lambda表达式、Stream API、Optional以及其他相关技术,并结合实际业务场景的应用,你将能够更高效地开发出安全、稳定和可维护的系统。建议在日常项目中逐步引入函数式编程思想,从简单的集合操作开始,逐步探索更多高级特性,并结合代码评审和测试不断完善实践经验。/*** 函数式编程*//*** Function<T, R>:接受T类型的参数,返回R类型的结果。

zjh285077371的专栏 1780

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Python函数式编程:从入门到走火入魔

附Java/C/C++/机器学习/算法与数据结构/前端/安卓/Python/程序员必读书籍书单大全: 书单导航页(点击右侧 极客侠栈 即可打开个人博客):极客侠栈 ①【Java】学习之路吐血整理技术书从入门到进阶最全50+本(珍藏版) ②【算法数据结构+acm】从入门到进阶吐血整理书单50+本(珍藏版) ③【数据库】从入门到进阶必读18本技术书籍网盘吐血整理网盘(珍藏版) ④【Web前端】从HT...

weixin_44524802的博客 312

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

python从入门到走火入魔_Python函数式编程:从入门到走火入魔

很多人都在谈论函数式编程(Functional Programming),只是很多人站在不同的角度看到的是完全不一样的风景。坚持实用主义的 Python 老司机们对待 FP 的态度应该更加包容,虽然他们不相信银弹,但冥冥中似乎能感觉到 FP 暗合了 Python 教义(The Zen of Python)的某些思想,而且既然 Python 是一门多范式编程语言,并在很大程度上支持函数式编程,那就更...

weixin_36329425的博客 143

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java中的函数式编程入门

函数式编程是一种编程范式,它将计算过程视为数学函数的计算。不可变性:数据一旦创建就不能改变。无副作用:函数调用不会改变外部状态。高阶函数:函数可以作为参数传递给其他函数或作为返回值返回。

微赚淘客开发者博客 926

函数式编程入门

什么是函数式编程 先了解一下编程范式: 编程范式 指的是一种编程风格,它描述了程序员对程序执行的看法。在编程的世界中,同一个问题,可以站在多个角度去分析解决,这些不同的解决方案就对应了不同的编程风格。 大致常见的有: 命令式编程,面向过程编程,面向对象编程,声明式编程,函数式编程。 那什么是函数式编程,来看一下定义: 函数式编程 属于声明式编程中的一种,它的主要思想是 将计算机运算看作为函数的计算,也就是把程序问题抽象成数学问题去解决。 函数式编程中,我们可以充分利用数学公式来解决问题。也就是说,任何问题都

weixin_40009892的博客 347

简明 JavaScript 函数式编程——入门篇

点击上方“IT平头哥联盟”,选择“置顶或者星标”你的关注意义重大!本文作者:网易云音乐前端团队写在开头本文较长,总共分为三大部分:(对于函数式编程以及其优点有一定理解的童鞋,可以直接从 第...

画漫画的程序员∙苏南 969

python入门必学:函数式编程20篇文章合集

在如今这个时间和知识都是碎片化的时代,C站根据C1-C4认证的成长路径,进行知识细化整理,形成系统化的知识图谱。 通过调研一线互联网大厂的招聘JD,小编对标C站能力认证要求,为大家整理了系列技术干货合集,助力小伙伴们顺利进大厂~ 小编根据C4认证的成长路径整理了python的相关资源。 欢迎大家扫描文末二维码,一起学习~ 函数式编程 【python函数式编程】 【10分钟快速入门Python函数式编程】 【一篇文章搞懂Python中的函数式编程】 【Python函数和函数式编程(两.

优快云能力认证官方博客 1444
上一篇: 简述事件循环机制
下一篇: 面向对象基础
ZoeLandia
博客等级 码龄6年 734粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值