java中的函数式编程(一)

article/2025/11/5 1:25:43

        当你安安稳稳的学着java,慢慢开始写代码。

        兢兢业业,本着面向对象的编程方式。

        知道有一种叫做“面向过程”的方式,但是你不在意。

        写了一段时间后有人告你,函数式编程很爽!

        你也看到了他给的一个实例,看着不错。

        于是你心里有了一个疑问:特么的什么是“函数式编程”?

 

        在说“函数式编程”之前,必须说明白一件事:"表达式(expression)"和"语句(statement)"

        最简单的区分是“表达式”指的是有返回值的方法;“语句”是无返回值的方法;

        从进化的底层来讲,我们总共处理了两件事:运算和记录。“表达式”和“语句”就与此相对应。

        "表达式"(expression)是一个单纯的运算过程,总是有(因为需要)返回值;函数式编程中我们使用互相使用返回值,所以只使用表达式,不使用语句。也就是说,每一步都是单纯的运算,而且都有返回值。

        "语句"(statement)是执行某种操作,没有返回值(或者说不需要考虑,忽略返回值)。

 

        函数式编程的开发动机:一开始就是为了处理运算(computation),不设计处理记录。"语句"属于记录信息,所以就被排斥在外。当然,实际应用中,光运算不记录是没有意义的,运算就是为结果。因此,编程过程中,函数式编程只要求把记录简化到最小,不要有不必要的读写行为,保持计算过程的单纯性。

 

        看到这里,我相信你似乎了解了什么。

        没错,函数式就是TM的有返回的相互调用。

        回头再看看自己的代码,哎呦

        好像也有那么一两个函数式,只是没连起来。

        对于开发而言,最初的便利只是减少代码量。

        那么好吧,是时候举个栗子了。

 

        先封装一个运算的类Operations.class:

package test;/*** 对运算做一个封装,包括“+,-,*,/”四则* @author ShuaiZhang**/
public class Operations {private double x;private Operations(double x){this.x = x;}//初始化包装对象public static Operations create(double initValus){return new Operations(initValus);}public Operations add(double add){return new Operations(x + add);}public Operations subtraction(double sub){return new Operations(x - sub);}public Operations multiply(double mul){return new Operations(x * mul);}public Operations division(double mul){return new Operations(x / mul);}//“记录”方法,返回实际值public double toDouble(){return x;}/*=============两个参数来运算,用结果直接构建对象=====================================*/	public static Operations add(double first,double second){return new Operations(first + second);}public static Operations subtraction(double first,double second){return new Operations(first - second);}public static Operations multiply(double first,double second){return new Operations(first * second);}public static Operations devision(double first,double second){return new Operations(first / second);}
}



 

        接下来是测试类Test.class:


package test;public class Test {public static double add(double first,double second){return first + second;}public static double subtraction(double first,double second){return first - second;}public static double multiply(double first,double second){return first * second;}public static double division(double first,double second){return first / second;}public static void main(String[] args) {//计算(1+2)/3*4//最基础的分布运算double first = 1+2;double second = first/3;double result1 = second*4;System.out.println("retult1:" + result1);//函数式实现计算double result2 = multiply(division(add(1,2),3),4);System.out.println("retult2:" + result2);//函数式形变:链式
//		double result3 = Operations.create(1).add(2).division(3).multiply(4).toDouble();double result3 = Operations.add(1,2).division(3).multiply(4).toDouble();System.out.println("retult3:" + result3);}
}
        

        Test.class的输出结果如下:


        我们再来个操作对象的例子:

        新建类UserInfo.class:

package test;public class PersonInfo {private String firstName;private String secondName;private int age;private String gender;public String getFirstName() {return firstName;}public String getSecondName() {return secondName;}public int getAge() {return age;}public String getGender() {return gender;}//由于程序不允许同参同名方法,这些被注释掉了
//	public void setFirstName(String firstName) {
//		this.firstName = firstName;
//	}
//	public void setSecondName(String secondName) {
//		this.secondName = secondName;
//	}
//	public void setAge(int age) {
//		this.age = age;
//	}
//	public void setGender(String gender) {
//		this.gender = gender;
//	}//这里比传统的setter方法多了返回类型,并且返回了当前类对象自己public PersonInfo setFirstName(String firstName) {this.firstName = firstName;return this;}public PersonInfo setSecondName(String secondName) {this.secondName = secondName;return this;}public PersonInfo setAge(int age) {this.age = age;return this;}public PersonInfo setGender(String gender) {this.gender = gender;return this;}public String toString(){return "姓名:"+this.firstName+"-"+this.secondName+"\n性别:"+this.gender + "\n年龄:" + this.age;}}

        在Test.class 中main方法新加如下代码:

		System.out.println("===============大分割线===========");System.out.println("===============分大割线===========");System.out.println("===============分割大线===========");System.out.println("===============分割线大===========");PersonInfo info1 = new PersonInfo();info1.setFirstName("Tom");info1.setSecondName("Jerry");info1.setAge(18);info1.setGender("man");System.out.println("人物信息:\n"+info1.toString());PersonInfo info2 = new PersonInfo();System.out.println("===============分割线===========");info2.setFirstName("汤姆").setSecondName("杰瑞").setGender("男").setAge(18);System.out.println("人物信息:\n"+info2.toString());

        整体的运行结果:



        从结果上来看,两个实体的内容是一样的,但是从代码量上来讲,这里大概只减少约三分之一,如果我们这里包含多个不同类型变量的初始化,那么代码量的差距将更大,理论上的差距大约是二十比一。就算没有那么夸张,极大的提高代码书写速度是肯定的。


http://chatgpt.dhexx.cn/article/MR0Fj0hP.shtml

相关文章

Java函数式编程(基础):第一部分

1.函数式编程有三个部分: 第一个部分是:Lambda表达式 第二个部分是:方法引用 第三个部分是:函数式接口 刚接触Lambda表达式的我,觉得它很神奇,能够用简短的代码,代替传统的编程方式 举一个简…

java-函数式编程浅谈

了解函数式编程的实际应用场景以及优点。 文章目录 什么是函数式编程函数式编程的使用原理解析 什么是函数式编程 以数学中的函数作为切入点,只关注参数之间的运算满足某种规则,例如zxy。 那么如何体现在编程中呢,熟知的function定义可以作…

Java 8函数式编程

函数式接口 一个接口中,有且只有一个抽象方法,这个接口就叫做函数式接口。常常使用FunctionalInterface注解作为编译校验。满足函数式接口的要求,才能校验通过,否则会在校验阶段失败。 接口中有且只能有一个抽象方法,…

【函数式编程实战】(一)Java演变与函数式编程

前言 📫作者简介:小明Java问道之路,专注于研究计算机底层/Java/Liunx 内核,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计📫 🏆CSDN专家博主/Java领域优质…

Java8 函数式编程

文章目录 Java 函数式编程1. Lambda 表达式1.1 标准格式1.2 使用前提1.2.1 一个参数1.2.2 多个参数1.2.3 有返回值 1.3 省略简化1.4 函数式接口1.4.1 Supplier1.4.2 Consumer1.4.3 Predicate1.4.4 Function 1.5 方法引用1.5.1 对象 :: 实例方法1.5.2 类 :: 静态方法1.5.3 类 ::…

入门 Java 函数式编程,看完这篇就清晰了

Java 在最开始是不支持函数式编程的,想来也好理解,因为在 Java 中类 Class 才是第一等公民,这就导致在 Java 中实现编程不是件那么容易的事儿,不过虽然难,但是结果我们也已经知道了,在 Java 8 这个大版本里…

Java函数式编程详解

Java从1.8以后引入了函数式编程,这是很大的一个改进。函数式编程的优点在提高编码的效率,增强代码的可读性。本文历时两个多月一点点写出来,即作为心得,亦作为交流。 1.Java函数式编程的语法: 使用Consumer作为示例&…

Java 函数式编程 详细介绍

在兼顾面向对象特性的基础上,Java语言通过Lambda表达式与方法引用等,为开发者打开了函数式编程的大门。 下面我们做一个初探。 Lambda的延迟执行 有些场景的代码执行后,结果不一定会被使用,从而造成性能浪费。而Lambda表达式是延…

Java基础函数式编程

本篇博文目录: 前言1.什么是函数式接口2.函数式编程(1) 使用Lambda表达式(2) Lambda表达式的进一步简化(3) Java内置函数式接口 3.方法引用(1) 方法引用的简单使用(2) 方法引用的分类 4.Stream API(1) 什么是Stream(2) 流式操作的执行流程(3) Stream的创建(4) Stream中间操作(5…

Java8新特性【函数式编程API、新时间日期处理API、Optional容器类】总结

文章目录 1、Lambda表达式1.1什么是Lambda表达式1.2从匿名类到 Lambda 的转换1.3Lambda表达式语法 2、函数式接口2.1什么是函数式接口2.2自定义函数式接口2.3内置核心函数式接口2.4接口中常用的默认方法 3、方法引用与构造器引用3.1 推荐用法3.2 基本格式3.3 语法详解(了解)3.3…

一文带你入门 Java 函数式编程

Java 在最开始是不支持函数式编程的,想来也好理解,因为在 Java 中类 Class 才是第一等公民,这就导致在 Java 中实现编程不是件那么容易的事儿,不过虽然难,但是结果我们也已经知道了,在 Java 8 这个大版本里…

Oracle数据库 存储过程入门

oracle存储过程:简单入门 一、定义 存储过程是一组为了完成特定功能的SQL语句,经编译后存储在数据库中。点击查看优缺点。二、存储过程简单入门 ***第一个存储过程:打印hello word, my name is stored procedure内容*** create or replace procedure m…

数据库储存过程超简单实例

网上看了半天都没找到一个完整储存过程从创建到调用的实例,于是自己写了一个简单的实例. 数据库创建存储过程,定义个函数 格式如下,开头DELIMITER //和结尾/DELIMITER 和BEGIN 和 END 是固定格式 定了一个叫test2()的方法(在mapper.xml中会指定这个函数名),in表示入参,varc…

DM8达梦数据库存储过程函数使用

DM8数据库的过程函数的编写主要分为4个部分:过程头部分,声明定义部分,执行部分和异常处理部分。在编写方面,过程和函数的主要区别还是函数可以返回一个值,但是过程没有。下面就从这4个部分来分别介绍过程的编写和一些常…

数据库:存储过程实验

一、实验目的及要求 目的 掌握存储过程的编写与调用 要求 掌握存储过程的编写;掌握存储过程的调用 二、实验条件 安装有SQL Server2014数据库的计算机 三、实验内容 使用事务、锁和游标;编写和使用存储过程;使用触发器 四、实验结果…

达梦数据库存储过程注意事项

引言:达梦数据库是一款国产数据库,在语法使用和函数方面和MySQL,Oracle有着很多相似的地方。但是也有一 些细微的区别。 1、先看一下达梦数据库的存储过程模板: CREATE OR REPLACE FUNCTION getName() AS OR IS DECLARE ... BEGI…

MySQL数据库-存储过程详解

存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批件,虽然它们的作用不仅限于批处理。在我看来, 存储过程就是有业务逻辑和流程的集合, 可以在存储过程中创建表,更新数据&#xff0c…

EXTJS5 入门指南

EXTJS5带领EXTJS步入了新的时代,Ext JS 5已经不再支持IE6、IE7和其他旧版本的浏览器了,这样可以显著减少跨整个框架的逻辑和样式设置。再加上额外的优化,Ext JS 5已经为企业级的Web应用程序迈出了惊人的一步。 EXTJS5不在和EXTJS4一样&#x…

ExtJS-入门(转载自http://www.blogjava.net/puras/archive)

2010 - 01 - 13 缩略显示 ExtJS-入门(转载自http://www.blogjava.net/puras/archive) 文章分类:Web前端 在ExtJS里最常用的,应该就是Ext.onReady这个方法了, 而且它也可能是你学习ExtJS所接触的第一个方法,这个方法在当前的DOM加载完毕后自动调用,保证…

Ext JS 6学习文档–第1章–ExtJS入门指南

Ext JS 入门指南 前言 本来我是打算自己写一个系列的 ExtJS 6 学习笔记的,因为 ExtJS 6 目前的中文学习资料还很少。google 搜索资料时找到了一本国外牛人写的关于 ExtJS 6 的电子书 [Ext JS 6 By Example]。这份资料在 PACKT 上卖 35.99 刀的,当然了万…