java-函数式编程浅谈

news2024/12/23 10:55:49

了解函数式编程的实际应用场景以及优点。

文章目录

  • 什么是函数式编程
  • 函数式编程的使用
  • 原理解析

什么是函数式编程

以数学中的函数作为切入点,只关注参数之间的运算满足某种规则,例如z=x+y。

那么如何体现在编程中呢,熟知的function定义可以作为参考,我们定义一个add方法,传入两个int参数x和y做和计算并输出结果:

public int add(int a, int b) {
    return a + b;
}

接下来我们直接看函数式编程如何实现:

BinaryOperator<Integer> binaryOperator = (x, y) -> x + y;

没错,定义一个BinaryOperator函数一行就能解决,就是如此优美(不过需要注意的是jdk8及以上才支持这种写法)。

带着欣赏的角度,我们继续深入理解函数式编程的魅力。

函数式编程的使用

除了上面我们距离的输入两个参数,输出一个结果的BiFunction函数,java还内置了许多函数:

接口输入参数返回类型说明
PredicateTboolean断言函数,对入参做判断是否符合条件
ConsumerT/消费函数,消费一个数据,无出参
Function<T, R>TR普通函数
Supplier/T生产函数,生产一个数据,无入参
UnaryOperatorTT一元函数(对应一个输入),输出和输入类型一致
BiFunction<T, U, R>(T,U)R2个输入与输出均为不同类型参数的函数(也可以类型一致)
BinaryOperator(T, T)T二元函数(对应两个输入),输出和输入类型一致,即上面举例的z=x+y
  1. 定义函数
// 断言函数,判断int x是否大于0
Predicate<Integer> predicate = x -> x > 0;
// 消费函数,对Object object做点什么
Consumer<Object> consumer = object -> System.out.println("对object做些什么...");
// 普通函数
Function<Integer, String> function = x -> "x的值,x=" + x;
// 生产函数,生产一个Object数据/对象
Supplier<Object> supplier = () -> new Object();
// 一元函数,输入和输出类型均为Integer,并对输入的值做和运算
UnaryOperator<Integer> unaryOperator = x -> x + x;
// 2个输入与输出均不同类型的函数,此处输入的两个参数类型保持一致
BiFunction<Integer, Integer, String> biFunction = (x, y) -> "x+y=" + x + y;
// 二元函数,输入和输出类型均为Integer,并对输入的值做和运算
BinaryOperator<Integer> binaryOperator = (x, y) -> x + y;
  1. 调用
BinaryOperator<Integer> binaryOperator = (x, y) -> x + y;
binaryOperator.apply(1, 2);

优点已经不言而喻了,非常简洁明了,这是关于函数式编程的脑图,可以作为参考:

img

原理解析

那么函数式编程是怎么实现的呢。

我们以BinaryOperator二元函数作为入口,查看究竟是如何达到函数式编程的优美:

在这里插入图片描述

观察源码,我们能够发现BinaryOperator其实是一个添加了@FunctionInterface注解并继承了BiFunction的泛型接口,其中包含了两个实现的方法:

  • minBy()
  • maxBy()

而BiFunction其实也是一个接口,包含了两个方法,其中apply()是未实现的方法:

  • apply()
  • addThen()

此时我们再回到我们的函数定义,实际上我们则是定义了一个实现apply()方法的实例。

BinaryOperator<Integer> binaryOperator = (x, y) -> x + y;

关键信息来了,敲重点:

函数式接口是只有一个抽象方法的接口只要接口中有且仅有一个方法没有被实现,那么这个接口就可以被看做是一个函数式接口

基于此概念,我们也可以定义属于我们自己的函数式接口,例如此处我们定义一个MyFunction的接口,并只预留一个未实现的方法doSomething。

@FunctionalInterface
public interface MyFunction<T> {

    /**
     * 做些什么...
     * @param t
     */
    T doSomething(T t);
}

public static void main(String[] args) {
    MyFunction<Integer> myFunction = x -> x;
    Integer integer = myFunction.doSomething(1);
    // 1
    System.out.println(integer);
}

而加上@FunctionalInterface注解的意义在于,标记了该接口是要作为函数接口,需要保证满足有且仅有一个未实现的方法,如果这个时候我们定义超过1个未实现的方法, 编译器则会提示我们报错Multiple non-overriding abstract methods

在这里插入图片描述

参考资料:

  • java函数式编程Function(java函数式编程实战)
  • 一文带你入门 Java 函数式编程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/100690.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用dompdf/dompdf实现生成pdf文件

一&#xff1a;dompdf/dompdf地址 github&#xff1a;https://github.com/dompdf/dompdf packagist&#xff1a;http://packagist.p2hp.com/packages/dompdf/dompdf 二&#xff1a;dompdf/dompdf安装 composer require dompdf/dompdf 三&#xff1a;dompdf/dompdf简单实例…

20221218-19英语学习

今日新词&#xff1a; wit n.智力; 头脑; 理解力; 风趣; 风趣的话语; 智者; 才子 alcohol n.酒精, 乙醇, 含酒精饮料 pub n.酒吧, 酒馆 instructor n.教员&#xff1b;教师 granted adv.&#xff08;表示肯定属实&#xff0c;然后再作另一番表述&#xff09;不错&#xff…

左神:高级进阶班4

1.让N个人过河所需最少船​编辑 2.最长回文子序列 3.最少添加字符让字符串变回文串​编辑 4.回文子串的最少切割次数 5.移除字符使字符串变回文串的方案数​编辑 1.让N个人过河所需最少船 思路&#xff1a;1.排序数组&#xff0c;用基数排序&#xff08;元素&#xff08;体…

计算机毕设Python+Vue学生信息管理系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

推特群推营销解读

推特群推王发现&#xff0c;许多品牌使用社交媒体作为提供更好客户支持的一种渠道。使用社交媒体可以实时响应客户的需求。通过电子邮件获取品牌有时可能需要长达48小时。但是&#xff0c;通常在社交媒体上回应的时间要快得多。客户将通过你的品牌发推文&#xff0c;你将在手机…

被动与主动信息收集 | 系统性学习 | 无知的我费曼笔记

文章目录信息收集-被动信息收集介绍收集手段收集内容信息用途信息收集-域名解析过程以手段域名解析过程信息收集 DNS**DNS 信息收集-NSLOOKUP****DNS 信息收集-DIG****查询网站的域名注册信息和备案信息**信息收集-被动信息收集手段大全**使用 Maltego 收集子域名信息**子域名介…

【论文简述】PatchmatchNet: Learned Multi-View Patchmatch Stereo(CVPR 2021)

一、论文简述 1. 第一作者&#xff1a;Fangjinhua Wang 2. 发表年份&#xff1a;2021 3. 发表期刊&#xff1a;CVPR 4. 关键词&#xff1a;MVS、深度学习、Patchmatch、自适应、迭代优化 5. 探索动机&#xff1a;可扩展性、时间、内存占用等效率问题依然没有解决。 While…

【电气安全】关于医疗专用隔离电源系统在医院配电系统中的应用

【摘要】 根据医疗场所分类说明医院尤其是 2 类 医疗场所的接地方案&#xff0c;分析医疗场所自动切断电源措 施&#xff0c;提出校验医疗 IT 系统配出回路长度&#xff1b;说明 RCD、RCM、IMD、IFLS 等的用途和范围&#xff1b;就应急医 院 2 类场所的配电方案进行探讨。 【…

JavaScript刷LeetCode拿offer-双指针技巧(上)

一、前言 一般情况下&#xff0c;遍历数组&#xff08;或者字符串&#xff09;操作&#xff0c;都是采用单指针从前往后或者从后往前依次访问数组&#xff08;或者字符串&#xff09;中的元素。 而对于以下情况&#xff0c;只采用单指针处理&#xff0c;则会徒增时间复杂度和…

统计学习方法 | 概论

一.简介 统计学习是关于计算机基于数据构建概率统计模型并运用模型对数据进行预测与分析的一门学科 1.统计学习方法的步骤 ①得到一个有限的训练数据集合 ②确定学习模型的集合&#xff08;模型&#xff09; ③确定模型选择的准则&#xff08;策略&#xff09; ④实现求解…

Python的安装与配置(图文教程)

安装Python 想要进行Python开发&#xff0c;首先需要下载和配置Python解释器。 下载Python 访问Python官网: https://www.python.org/点击downloads按钮&#xff0c;在下拉框中选择系统类型(windows/Mac OS/Linux等)选择下载最新版本的Python安装Python 双击下载好的Python…

五款几乎没人知道的小众软件,按需下载

分享是一种神奇的东西&#xff0c;它使快乐增大&#xff0c;它使悲伤减小&#xff0c;坚持分享一些好用的软件给大家。 1.开源分享工具——ShareX ShareX 是一款 Windows 上开源的截图、文件共享和生产力工具&#xff0c;它是一款功能非常强大的分享工具&#xff0c;只要是免…

【算法】可解释机器学习-ZFNet(Datawhale)

可解释机器学习-ZFNetZFNet算法介绍&#xff1a;AlexNet的提出使得大型卷积网络开始变得流行起来&#xff0c;但是人们对于CNN网络究竟为什么能表现这么好&#xff0c;以及怎么样能变得更好尚不清楚。 因此为了解决上述两个问题&#xff0c;ZFNet提出了一种可视化技术&#xff…

如何治理谐波问题?——有源滤波器

安科瑞 华楠 一、谐波的定义 任何一种周期性非正弦波形都可以看成是由若干种频率不同的正弦波合成的&#xff0c;其中频率为工频的波形我们称为基波&#xff0c;大于1 整数倍基波频率的正弦波分量称为谐波。 总谐波畸变由不同频率的分次谐波合成&#xff0c;各次谐波频率与基…

asp写的百度ocr识别文字-通用文字识别(高精度版)源码下载

今天接到一个客户需求&#xff0c;需要用ASP写一个百度OCR文字识别代码&#xff0c;他的程序都是用ASP写的&#xff0c;所以我们也需要用ASP给他实现百度OCR文字识别&#xff0c;我们在百度AI网站上启用了通用文字识别高精度版&#xff0c;利用高精度板来实现它的业务需求。在上…

【C++】泛型编程 _函数模板和类模板的基本使用

1.泛型编程 如何实现一个通用的交换函数&#xff1f;这在C语言中是无法实现的&#xff0c;但是C却可以。 C语言一次只能实现一个类型的交换&#xff1a; void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& left, …

计算机毕设Python+Vue学生信息管理系统 (程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

关于小程序订单中心页设置的公告

为进一步规范小程序交易生态、提升用户购物体验、满足用户在有交易的小程序中便捷查看订单信息的诉求&#xff0c;自2022年12月31日起&#xff0c;对于有“选择商品/服务-下单-支付”功能的小程序&#xff0c;需按照平台制定的规范&#xff0c;在小程序内设置订单中心页。 开发…

创建DataFrame()对象--Pandas

1. DataFrame DateFrame对象是Pandas最常用的数据结构&#xff0c;是由不同类型的列组成的二维数据表结构&#xff0c;类似于EXCEL表&#xff0c;语法格式如下&#xff1a; pandas.DataFrame(dataNone, indexNone, columnsNone, dtypeNone, copyNone)1.1 函数参数:data 参数…

计算机操作系统笔记总结:Part2 进程与线程

文章目录1 进程1.1 进程的概念、组成与特征1.2 进程的状态与转换1.3 进程的组织1.4 进程控制1.5 进程通信2 线程与多线程模型2.1 线程的概念2.2 线程的实现方式2.3 多线程模型2.4 线程的状态与转换3 处理机调度3.1 调度的三个层次3.2 进程的挂起态与七状态模型3.3 进程调度3.3.…