java-函数式编程浅谈

article/2025/11/5 20:43:39

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

文章目录

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

什么是函数式编程

以数学中的函数作为切入点,只关注参数之间的运算满足某种规则,例如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);// 1System.out.println(integer);
}

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

在这里插入图片描述

参考资料:

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

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

相关文章

Java 8函数式编程

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

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

前言 &#x1f4eb;作者简介&#xff1a;小明Java问道之路&#xff0c;专注于研究计算机底层/Java/Liunx 内核&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计&#x1f4eb; &#x1f3c6;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 在最开始是不支持函数式编程的&#xff0c;想来也好理解&#xff0c;因为在 Java 中类 Class 才是第一等公民&#xff0c;这就导致在 Java 中实现编程不是件那么容易的事儿&#xff0c;不过虽然难&#xff0c;但是结果我们也已经知道了&#xff0c;在 Java 8 这个大版本里…

Java函数式编程详解

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

Java 函数式编程 详细介绍

在兼顾面向对象特性的基础上&#xff0c;Java语言通过Lambda表达式与方法引用等&#xff0c;为开发者打开了函数式编程的大门。 下面我们做一个初探。 Lambda的延迟执行 有些场景的代码执行后&#xff0c;结果不一定会被使用&#xff0c;从而造成性能浪费。而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 在最开始是不支持函数式编程的&#xff0c;想来也好理解&#xff0c;因为在 Java 中类 Class 才是第一等公民&#xff0c;这就导致在 Java 中实现编程不是件那么容易的事儿&#xff0c;不过虽然难&#xff0c;但是结果我们也已经知道了&#xff0c;在 Java 8 这个大版本里…

Oracle数据库 存储过程入门

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

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

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

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

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

数据库:存储过程实验

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

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

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

MySQL数据库-存储过程详解

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

EXTJS5 入门指南

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

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

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

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

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

Extjs——初步学习

最近在系统学习Extjs框架&#xff0c;从刚一开始接触Extjs到现在发现对Extjs越来越喜欢了。刚开始只是想在页面上实现一个展示大量图片的功能&#xff0c;就像在线订餐系统展示菜单的效果那样&#xff0c;每幅图片上都有一些必要的信息、动作、链接等。效果如下图&#xff1a; …

Extjs基础(一)

1.1基础学习 说明&#xff1a; 本示例的所有代码均在extjs6.2版本上测试通过,学习内容来源于官方文档和自己的一些见解。 1.1.1window组件 简单的一个window面板&#xff1a; title: 窗口标题,height: 220, //可以使用百分比width: 220, html: 内容部分,resizable: true, //…