从面向过程出发到函数式编程(下篇)

面向过程编程(pop),面向对象编程(oop),函数式编程(fp) 1、概念 面向过程编程(procedure oriented Programming)(POP) 面向对象编程(object oriented programming)(OOP) 函数式编程(functional programming)(FP) 2、解释 面向过程编程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。 面向对象编程是... 阅读详情

小编

专注分享Java技术,坚持原创,你的关注和转发就是我们最好的动力。

前言

在上一个章节我们讲到Java程序的函数式编程是如何发展的而来的,那么本篇我们来说下Java为函数式编程提供哪些便利的地方。

函数式接口

我们知道,方法引用和Lambda表达式使用的时候,只需要知道我们的方法签名就行,而不在乎我们的接口名字。那么java的函数式接口真是为了避免我们每次使用需要自己去创建接口而提供的。

java提供的是函数式接口位于java.util.function.*路径下面,这些接口代表了接口调用的各种不同应用场景。

Function接口

Function<T,R> 接口用来根据一个类型的数据得到另一个类型的数据,前者称为前置条件,后者称为后置条件。

Function 接口中最主要的抽象方法为:R apply(T t) ,根据类型T的参数获取类型R的结果。下面我们将 String 类型转换为 Integer 类型:

public class Demo11FunctionApply {
    private static void method(Function<String, Integer> function) {
        int num = function.apply("10");
        System.out.println(num + 20);
    }


    public static void main(String[] args) {
        method(s ‐ > Integer.parseInt(s));
    }
}

Function 接口中有一个默认的 andThen 方法,该方法同样用于“先做什么,再做什么”的场景。下面我们来看一个例子,把传入的String字符串转成int类型,做加法操作后,把结果交给第二个Function对象:

public class Demo12FunctionAndThen {
    private static void method(Function<String, Integer> one, Function<Integer, Integer> two) {
        int num = one.andThen(two).apply("10");
        System.out.println(num + 20);
    }


    public static void main(String[] args) {
        method(str‐ > Integer.parseInt(str) + 10, i ‐>i *= 10);
    }
}

Predicate接口

如果我们需要对某种数据类型进行判断,从而得到一个Boolean值结果。那么我们就可以使用到Predicate接口。

boolean test(T t)是Predicate接口中包含一个抽象方法,用在条件判断的场景中,下面我们以一个判断字符串长度为例:

private static void method(Predicate<String> predicate) {
    boolean veryLong = predicate.test("HelloWorld");
    System.out.println("你的字符串是否超出5位字符:" + veryLong);
}


public static void main(String[] args) {
    method(s -> s.length() > 5);
}

Predicate接口有一个and和or的默认方法,用于做与和或的判断逻辑,我们以一个判断一个字符串长度既要大于5,又要小于10为例子:

private static void method(Predicate<String> one, Predicate<String> two) {
    boolean isValid = one.and(two).test("Helloworld");
    System.out.println("字符串符合要求吗:" + isValid);
}
public static void main(String[] args) {
    method(str -> str.length()>5, str -> str.length()<6);
}

“非”的逻辑关系的默认方法是negate。JDK源码中是将test方法返回值进行取反,所以一定要在test方法调用之前调用negate方法,正如and和or的方法一样。

private static void method(Predicate<String> predicate) {
    boolean veryLong = predicate.negate().test("HelloWorld");
    System.out.println("你的字符串不是超出5位字符:" + veryLong);
}


public static void main(String[] args) {
    method(s -> s.length() > 5);
}

Supplier接口

Supplier接口用来获取一个泛型参数指定类型的对象数据,作为一个生成接口,他需要对应的Lambda表达式需要“对外提供”一个符合泛型类型的对象数据:

private static String getString(Supplier<String> function) {
    return function.get();
}
public static void main(String[] args) {
    String msgA = "Hello";
    String msgB = "World";
    System.out.println(getString(() -> msgA +msgB));
}

Consumer接口

Consumer<T> 接口则正好与Supplier接口相反,它不是生产一个数据,而是消费一个数据,void accept(T t)用于消费一个指定泛型的数据,基本使用如下

private static void consumeString(Consumer<String> function) {
    function.accept("Hello");
}
public static void main(String[] args) {
    consumeString(s ‐ > System.out.println(s));
}

结合Stream API的时候

Stream API的reduce()使用到Function接口:

// 从1到10累计并且把计算结果打印
List<Integer> values = range(1,10);
Integer result = values.stream().reduce(0, Integer::sum);

Stream API的forEach()使用到Consumer接口:

// 将1-10全部打印
// Consumer接口,只接收数据不返回
values.stream().forEach(System.out::println);

Stream API的filter()使用到Predicate接口:

// 1到10挑选偶数,打印累计的值
values.stream().filter(value -> value%2==0).reduce(0,Integer::sum);

Stream API的map()使用到Function接口:

// 1到10挑选偶数,扩大2倍
values.stream().filter(value -> value%2==0).map(value -> value*2);

小结

  • Consumer:只接受数据,不返回(消费者)

  • Supplier:没有接收数据,只有返回(提供数据,生产者)

  • Predicate:判断(1-10挑选偶数)

  • Function:转换(Integer -> Integer*2)

专注分享Java技术,跟我一起学习吧

长按识别二维码关注

编程范式: 面向过程与函数式 一、 面向过程 ​ 基于面向过程开发程序就好比在设计一条流水线,若程序一开始是要着手解决一个大的问题,按照过程式的思路就是把这个大的问题分解成很多个小问题或子过程去实现,然后依次调用即可,这极大地降低了程序的复杂度。举例如下: ​ 写一个数据远程备份程序,分三步:本地数据打包,上传至云服务器,检测备份文件可用性 面向过程总结: 1、优点 将复杂的问题流程化,进而简单化 2、缺点 程序的可扩展性极差,因为一套流水线或者流程就是用来解决一个问题 二、 函数式 函数式编程并非用函数编程这么简单,而是将计算机的运算 阅读详情

相关推荐

1. 滚雪球学Python第四季开启,一需三吃,Python 函数式编程初识,面向过程,面向对象,函数式

启动,学Python就从这里开始吧

梦想橡皮擦,专栏100例写作模式先行者,现象级专栏 《Python 爬虫 100 例》作者、《滚雪球学 Python 专栏》原创者 1万+

Python从入门到实践:函数之两种编程思想(面向过程与函数式编程)

“面向过程”的重心就在过程二字,把一个大问题拆分成很多个小问题,然后依次执行每个小问题,这是一种流水线的、从上而下的过程。

weixin_43507744的博客 818

Vivado 2018.3 SDK烧写bin文件避坑指南:如何解决QSPI模式下的常见错误

本文深入解析了在Vivado 2018.3 SDK中为Zynq FPGA烧写QSPI Flash时遇到的常见问题,特别是启动模式为QSPI时出现的警告与失败。文章从Zynq启动机制入手,提供了修改FSBL代码以强制使用JTAG模式、调整硬件配置等核心解决方案,并分享了实战案例与最佳实践,帮助开发者高效避坑,确保bin文件烧写成功。

arduino9maker的博客 388

面向过程与函数式

1、面向过程 1.1、编程思想/范式 编程范式指的就是编程的套路,打个比方,如果把编程的过程比喻为练习武功, 那编程范式指的就是武林中的各种流派,而在编程的世界里常见的流派有:面向过 程、函数式、面向对象等, 1.2、面向过程的编程思想 面向过程核心是"过程"二字,过程即流程,指的是做事的步骤:先什么、再什么、 后干什么基于该思想编写程序就好比在设计一条流水线,即无论采用什么语言、无 论依据...

weixin_46466247的博客 663

从零开始!在 Windows 上安装与配置 Dify

这篇博客将详细介绍如何在 Windows 系统上部署 Dify,适合零基础用户。从 Docker 和 WSL 的安装配置开始,逐步指导用户设置 Git、Docker 环境以及 Dify 配置文件,解决可能遇到的端口冲突等问题,最终完成 Dify 的启动和测试。通过简明易懂的步骤,帮助用户在本地成功运行 Dify,实现模型供应商配置,让 Dify 项目在 Windows 平台上顺利上线。

qq_49035156的博客 5万+

基因家族的鉴定-基于Windows系统上的HMMER

基因家族的鉴定-基于Windows系统上的HMMER。

liangjinghui123的博客 3241

Python重点知识五:函数式编程(面向过程)

函数式编程

weixin_71370467的博客 191

3D Slicer肺部CT病灶体积测量:阈值法实操全流程

在医学影像分析中,病灶体积的精准测量是肿瘤评估、疗效随访和科研统计的重要基础。传统逐层手动勾画不仅耗时,且主观差异大,而基于CT值的阈值分割技术,通过设定灰度区间自动提取目标体素,能够快速生成三维分割结果,具有高效、可重复、边界标准统一的优势,尤其适用于肺部实性结节这类与周围肺实质对比度高的病灶。理解体素与CT值的关系,掌握阈值范围的设定逻辑,并配合连通域分析、边缘修正等工程化操作,即可在3D Slicer中稳定获得可靠的体积数据。本文从技术原理出发,系统梳理了DICOM导入、窗宽窗位调节、阈值选择、三维重

weixin_29050271的博客 251

函数-面向过程的编程

函数−面向过程的编程函数-面向过程的编程函数−面向过程的编程 4.1 函数的定义及调用 4.1.1 为什么要用函数 1、提高代码复用性——抽象出来,封装为函数 2、将复杂的大问题分解成一系列小问题,分而治之——模块化设计的思想 3、利于代码的维护和管理 顺序式 # 5的阶乘 n = 5 res = 1 for i in range(1, n+1): res *= i print(res) # 20的阶乘 n = 20 res = 1 for i in range(1, n+1): res

Major_S的博客 497

【用unity实现100个游戏之19】制作一个3D传送门游戏,实现类似鬼打墙,迷宫,镜子,任意门效果(附项目源码)

本文介绍了Unity中实现传送门效果的完整流程。通过第一人称角色控制器实现移动,使用PortalView脚本和自定义Unlit Shader渲染门内场景,巧妙利用相机位置和旋转同步实现动态视角。重点解决了近裁剪面问题,确保远距离渲染正确性。最后通过PortalTeleporter脚本实现传送功能,检测碰撞并计算相对位置进行瞬移。该方法无需复杂插件,代码简洁高效,适用于各类3D场景中的传送门实现。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1万+

PTC Creo软件二次开发:使用C++进行Creo二次开发实战

C++是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。由Bjarne Stroustrup在贝尔实验室开发,最初作为C语言的增强版出现,后来发展成为一种独立的语言。C++不仅保留了C语言的高效性和灵活性,还引入了类、模板、命名空间等高级特性,使其成为开发复杂系统和软件的理想选择。

kkchenjj的博客 4036

面向对象编程与面向过程编程和函数式编程之间的区别

是现在流行的编程范式(编程风格)。。随着面向对象编程的出现,面向过程编程已经逐渐退出了历史舞台,函数式编程目前还没有被程序员广泛接受,只能作为面向对象编程的补充。为了更好地理解面向对象编程,我们在本节中补充讲解面向过程编程和函数式编程,并且将面向对象编程与面向过程编程和函数式编程进行对比。

红军不怕远征难,万水千山只等闲 3290

YOLOv8 | 损失函数改进,最新提出的Shape-IoU,有效涨点

作为检测器定位分支的重要组成,边框回归损失在目标检测任务中发挥巨大作用。现有的边框回归方法,通常考虑了GT框与预测框之间的几何关系,通过使用边框间的相对位置与相对形状等计算损失,而忽略了边框其自身的形状与尺度等固有属性对边框回归的影响。为了弥补现有研究的不足,本文提出聚焦边框自身形状与尺度的边框回归方法。首先我们对边框回归特性进行分析,得出边框自身形状因素与尺度因素会对回归结果产生影响。

kay_545 1913

我对函数式编程、面向对象和面向过程三者的理解

从开始学习程序设计,这三个词依次随着开发语言出现在我的世界里,虽然一路在进阶升级打怪,但是一直缺少对三者深入思考理解的过程,知道的都是从各个知识获取途径的观念,还未形成自己的认知,直到被米boss问道,区别是什么,突然懵了,把那些已知的概念搬出来,讲给米boss,看到眼神的那一刻我知道,我又没理解正确。也是经过这段时间思考了,虽然不知道是否理解正确,但是写写自己的认知吧,这样万一有天开窍了,还知道错到什么地方,如果各位大神看出了什么理解偏颇之处,恳请各位大神赐教。 面向过程(PO) ...

漫漫长途,终有回转;余味苦涩,终有回甘 5755

【完整梳理验证】企业微信第三方应用接入全流程java版

由企业内部的开发者自己开发部署,相当于是企业自己的资产,调用接口基本没有任何限制。由SaaS服务商的开发者开发并部署在服务商侧,面向所有企业。需要企业授权使用(先试用后付费),服务商仅可获取企业授权部分的权限,相当于白名单控制。由服务商的开发者开发,但部署在企业内部。一般是线下签约采购方式,因此权限几乎与自建应用无异,企业管理员只需要配置不对服务商开放的敏感权限,相当于黑名单控制。服务商后台地址:企业微信服务商官网企业管理后台地址:企业微信管理后台服务商,可以理解为 SAAS 中的运营端。企业管理端,可以理

Hello, New World! 2759

android 蓝牙通讯demo

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

从面向过程出发到函数式编程(上篇)

小编专注分享Java技术,坚持原创。你的关注和转发就是我们最好的动力。前言java8为我们引入的Lambda表达式、Stream ApI以及方法引用,它们为了java提供函数式编程的支持...

ZeJava的博客 402

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

01、面向对象 vs 面向过程 vs 函数式

如:FileConstants、MysqlConstants 等,FileUtils、StringUtils 等。相应的 VO(View Object)、BO(Business Object)、Entity。Controller 类、Service 类、Repository 类中。一个类,无论是否需要,为所有属性都提供了 get / set 方法。两个语法概念,不支持面向对象编程的特性(如:封装、继承、多态),为核心,把问题分解成一个个步骤,对每个步骤进行相应的抽象,形成。

butingdejiaobu的专栏 1039

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

常见的编程范式-面向过程,面向对象,函数式编程,响应式编程

编程范型提供了程序员对程序执行的看法。例如,在面向对象编程中,程序是一系列相互作用的对象。在面向过程编程中,程序是一系列步骤的组合的过程,先执行那个步骤,然后执行那个步骤,最后在执行那个步骤。在面向函数式编程中,一个程序会被看作是一个无状态的函数计算的序列,函数可以作为参数,返回值。在响应式编程中,程序被看作是数据流和以及其传播的过程。 面向过程编程 使用过C语言,我们就能深刻体会面向过程编程。我们会把一个任务分成若干个步骤,先执行哪一步,然后执行哪一步,最后执行哪一步,就相当于生产线,吭哧吭哧执行完,任务

wfeii的博客 1508

面向对象与面向过程、函数式编程

本文比较了三种编程范式在Vue3中的应用:面向过程、面向对象和函数式编程。面向过程通过组合式API实现数据和逻辑分离,适合简单场景;面向对象采用类封装数据和方法,适合复杂业务;函数式编程强调纯函数和不变性,通过Vue响应式系统实现状态管理。实际开发中可混合使用这些范式,如用面向过程处理简单逻辑,用面向对象封装复杂业务模型。Vue3的组合式API灵活支持这些范式,开发者可根据需求选择最佳实践。

睡不着的可乐博客 660

函数式编程

什么是函数式编程 ​ 函数式编程(Functional Programming, FP),FP 是编程范式之一,我们常听说的编程范式还有面向过程编程、面向对象编程。 面向对象编程的思维方式:把现实世界中的事物抽象成程序世界中的类和对象,通过封装、继承和多态来演示事物事件的联系 函数式编程的思维方式:把现实世界的事物和事物之间的联系抽象到程序世界(对运算过程进行抽象) 程序的本质:根据输入通过某种运算获得相应的输出,程序开发过程中会涉及很多有输入和输出的函数 x -> f(联系、映射) -&g

weixin_38255079的博客 4349

python是一门只面向过程的语言-python学习20——面向过程编程与函数式

一 编程范式​ 很多初学者在了解了一门编程语言的基本语法和使用之后,面对一个’开发需求"时仍然会觉得无从下手、没有思路/套路,本节主题“编程范式”正是为了解决该问题,那到底什么是编程范式呢?编程范式指的就是编程的套路,打个比方,如果把编程的过程比喻为练习武功,那编程范式指的就是武林中的各种流派,而在编程的世界里常见的流派有:面向过程、函数式、面向对象等,本节我们主要介绍前两者。​ 在正式...

weixin_39945789的博客 653

函数式编程(以Python编程语言为例)介绍

函数式编程(Functional Programming),以Python编程语言为例介绍

cnds123的专栏 1645

19、面向过程编程

编程范式 面向过程 函数式 匿名函数与lambda map、reduce、filter 一、编程范式 很多初学者在了解了一门编程语言的基本语法和使用之后,面对一个’开发需求‘时仍然会觉得无从下手、没有思路/套路,本节主题“编程范式”正是为了解决该问题,那到底什么是编程范式呢? 编程范式指的就是编程的套路,打个比方,如果把编程的过程比喻为练习武功,那编程范式指的就是武林中的各种流派,而在编程的世界里常见的流派有:面向过程、函数式、面向对象等,本节我们主要介绍面向过程与函数式。 在正式介绍前,我们需要强调:

weixin_56691590的博客 892

什么是函数式编程?

函数式编程的英文翻译是 Functional Programming。 那到底什么是函数式编程呢? 在前面的章节中,我们讲到,面向过程、面向对象编程并没有严格的官方定义。在当时的讲解中,我也只是给出了我自己总结的定义。而且,当时给出的定义也只是对两个范式主要特性的总结,并不是很严格。实际上,函数式编程也是如此,也没有一个严格的官方定义。所以,接下来,我就从特性上来告诉你,什么是函数式编程。 严格上来讲,函数式编程中的“函数”,并不是指我们编程语言中的“函数”概念,而是指数学“函数”或者“表达式”(比如,y=

鸭梨的博客 3784
上一篇: 从面向过程出发到函数式编程(上篇)
下一篇: 对象的最后一次救赎
新时代Java农民工
博客等级 码龄7年 16粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值