Java-8函数式编程设计-Functional-Interface
Java 8函数式编程设计-Functional-Interface
我自己的理解,函数式编程对用户最大的价值是促使开发者养成模块化编程的习惯,代码可读性和维护性提高很多。
通过阅读JDK 8的 java.util.function 和
java.util.stream 包源码,意在理解Java的函数式接口设计。
读后自己的理解:Java函数式编程的核心是将最基础的数学函数抽象成接口对象,可在已有的接口上进行积木拼插组合,形成完整地类型转换系统。最基础的数学函数包括一元函数、谓词、二元函数、运算符计算,对应的Java接口分别是Function、Predicate、BiFunction、BinaryOperator。
源码阅读笔记:jdk-8-Functional-Interface
函数式接口API
- @FunctionalInterface
- Functional interfaces
- Function
- Consumer
- Predicate
- Supplier
- 数据流特性和操作
- BaseStream
- Stream
- 使用示例
@FunctionalInterface
- 函数式接口注解
- 从概念上讲,函数式接口都只有一个抽象方法。
- 请注意,可以使用Lambda表达式、方法引用和构造器引用创建函数式接口的实例。
Functional interfaces
- 函数式接口提供lambda表达式和方法引用的目标类型
- 每个函数式接口有一个单一的抽象方法,称为函数方法
- 函数式接口可以匹配或适配为lambda表达式的参数和返回类型
- 函数式接口可以在多个上下文中提供一个目标类型,如赋值上下文、方法调用上下文、转换上下文
- 函数式接口往往代表抽象的概念,如函数、操作、谓词
- 可扩展的命名约定
- 基本的一元函数:Function、Consumer、Predicate、Supplier
- 二元函数:BiFunction、BiConsumer、BiPredicate
- 扩展的运算符:UnaryOperator、BinaryOperator
- 泛型->基本类型:int、long、double
一元函数
Function<T, R>
- 从T到R的一元映射函数,接受一个参数并产生一个结果的一元函数 (类型转换函数)
- R apply(T t)
- 组合函数
- compose(before):V -> T -> R
- andThen(after):T -> R -> V
- 基本类型的参数:IntFunction、LongFunction、DoubleFunction
- 基本类型的结果:ToIntFunction、ToLongFunction、ToDoubleFunction
- 基本类型的参数和结果:IntToLongFunction、IntToDoubleFunction
Consumer<T>
- 从T到void的一元函数,接受一个入参但不返回任何结果的操作
- void accept(T t)
- andThen(after):N个消费者模式,多次消费的场景
- 基本类型的参数:IntConsumer、LongConsumer、DoubleConsumer
Predicate<T>
- 一个参数的谓词(返回布尔值的函数)
- boolean test(T t)
- 谓词函数:and、negate、or
- 基本类型的参数:IntPredicate、LongPredicate、DoublePredicate
Supplier<T>
- 表示结果的供应商
- T get()
- 基本类型的结果:BooleanSupplier、IntSupplier、LongSupplier、DoubleSupplier
使用图表方式总结如下:
| 一元函数 | 方法 | 类型转换 | 组合方法 | 基本类型专用类 |
|---|---|---|---|---|
| Function<T, R> | R apply(T t) | T->R | compose(before)、andThen(after) | IntFunction、ToIntFunction、IntToLongFunction |
| Consumer | void accept(T t) | T->void | andThen(after) | IntConsumer |
| Predicate | boolean test(T t) | T->boolean | and、negate、or | IntPredicate |
| Supplier | T get() | *->T | IntSupplier、BooleanSupplier |
二元函数
BiFunction<T, U, R>
- 从(T、U)到R的二元函数,接受两个参数并产生一个结果的二元函数
- R apply(T t, U u)
- 组合函数
- andThen(Function<? super R, ? extends V> after):(T, U) -> R -> V
- 基本类型的结果:ToIntBiFunction<T, U>、ToLongBiFunction<T, U>、ToDoubleBiFunction<T, U>
BiConsumer<T, U>
- 从(T、U)到void的二元函数,接受两个入参但不返回任何结果的操作
- void accept(T t, U u)
- 基本类型的参数:ObjIntConsumer、ObjLongConsumer、ObjDoubleConsumer
BiPredicate<T, U>
- 两个参数的谓词(返回布尔值的函数)
- boolean test(T t, U u)
- 谓词函数:and、negate、or
使用图表方式总结如下:
| 二元函数 | 方法 | 类型转换 | 组合方法 | 基本类型专用类 |
|---|---|---|---|---|
| BiFunction<T, U, R> | R apply(T t, U u) | (T、U)->R | andThen(Function after) | ToIntBiFunction<T, U> |
| BiConsumer<T, U> | void accept(T t, U u) | (T、U)->void | andThen(after) | ObjIntConsumer |
| BiPredicate<T, U> | boolean test(T t, U u) | (T、U)->boolean | and、negate、or |
扩展的运算符
UnaryOperator<T>
- 一元运算符(单个操作数,生产与操作数类型相同的结果)
- 继承自Function<T, T>
- 基本类型的运算符:IntUnaryOperator、LongUnaryOperator、DoubleUnaryOperator
BinaryOperator<T>
- 二元运算符(两个相同类型的操作数,生产与操作数类型相同的结果)
- 继承自BiFunction<T, T, T>
- 基本类型的运算符:IntBinaryOperator、LongBinaryOperator、DoubleBinaryOperator
| 运算符 | 父类 | 组合方法 | 基本类型专用类 |
|---|---|---|---|
| UnaryOperator | Function<T, T> | IntUnaryOperator: int applyAsInt(int operand) | |
| BinaryOperator | BiFunction<T, T, T> | minBy、maxBy | IntBinaryOperator: int applyAsInt(int left, int right) |
数据流操作
BaseStream<T,S extends BaseStream<T,S>>
数据流操作特性
- 顺序流
- 并行流
- 拆分器
- 关闭数据流(数据流管道)
Stream<T>
数据流
- 中间操作,返回
Stream<T>- filter
- distinct
- map
- flatMap
- peek
- 终结操作,返回结果/
Optional<T>- collect
- forEach
- reduce
- anyMatch
- findAny
- findFirst
- count
- max
- min
使用示例
Optional<T>
单值数据流
- 可能包含null值的容器对象,包装方法的返回结果
- empty()、of(T value)、ofNullable(T value)
- isPresent()、get()
- void ifPresent(Consumer<? super T> consumer)
- Optional filter(Predicate<? super T> predicate):过滤操作
- Optional map(Function<? super T, ? extends U> mapper)
- Optional flatMap(Function<? super T, Optional> mapper)
- T orElse(T other)、T orElseGet(Supplier<? extends T> other)、T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X
- 基本类型实现:OptionalInt、OptionalLong、OptionalDouble
- 使用模式:
- Optional.ifPresent(consumer)
- Optional.filter(predicate).flatMap(mapper)
- Optional.filter(predicate).map(mapper)
祝大家玩得开心!ˇˍˇ
简放,杭州
相关文章:
Java-8函数式编程设计-Functional-Interface
Java 8函数式编程设计-Functional-Interface 我自己的理解,函数式编程对用户最大的价值是促使开发者养成模块化编程的习惯,代码可读性和维护性提高很多。 通过阅读JDK 8的 java.util.function 和 java.util.stream 包源码,意在理解Java的函数…...
Linux TCP 参数设置
文章目录 Linux TCP 参数设置参考 Linux TCP 参数设置 查询tcp相关内核参数 sysctl -a|grep ipv4|grep -i --color tcp[rootlocalhost ~]# sysctl -a|grep ipv4|grep -i --color tcp sysctl: reading key "net.ipv6.conf.all.stable_secret" sysctl: reading key &…...
Dubbo之消费端服务RPC调用
在消费端服务是基于接口调用Provider端提供的服务,所以在消费端并没有服务公共接口的实现类。 使用过程中利用注解DubboReference将目标接口作为某个类的字段属性,在解析该类时获取全部字段属性并单独关注解析存在注解DubboReference的字段属性。通过步…...
报表控件Stimulsoft 新版本2024.1中,功能区工具栏新功能
今天,我们将讨论Stimulsoft Reports、Dashboards 和 Forms 2024.1版本中的一项重要创新 - 在一行中使用功能区工具栏的能力。 Stimulsoft Ultimate (原Stimulsoft Reports.Ultimate)是用于创建报表和仪表板的通用工具集。该产品包括用于WinF…...
零样本带解释性的医学大模型
带解释性的医学大模型 提出背景解法拆解方法的原因对比以前解法 零样本带解释性的医学大模型如何使用CLIP模型和ChatGPT来进行零样本医学图像分类用特定提示查询ChatGPT所生成的医学视觉特征描述相似性得分在不同症状上的可视化,用于解释模型的预测注意力图的可视化…...
英文输入法(C 语言)
题目来自于博主算法大师的专栏:最新华为OD机试C卷AB卷OJ(CJavaJSPy) https://blog.csdn.net/banxia_frontend/category_12225173.html 题目 主管期望你来实现英文输入法单词联想功能,需求如下: 依据用户输入的单词前…...
万众一心 · 喜赢未来,2023宇凡微年会暨阳朔之旅
宇凡微 万众一心 喜赢未来 2024宇凡微年会暨阳朔之旅 在一起,做时间的朋友,迈向第一 前言 INTRODUCTION 感恩宇凡微过去七年砥砺路,携手宇凡微未来七年新征程。2024年1月24日~1月27日,宇凡微在广西桂林阳朔举办了以“感恩有…...
【Spring】 AOP面向切面编程
文章目录 AOP是什么?一、AOP术语名词介绍二、Spring AOP框架介绍和关系梳理三、Spring AOP基于注解方式实现和细节3.1 Spring AOP底层技术组成3.2 初步实现3.3 获取通知细节信息3.4 切点表达式语法3.5 重用(提取)切点表达式3.6 环绕通知3.7 切…...
R语言入门笔记2.6
描述统计 分类数据与顺序数据的图表展示 为了下面代码便于看出颜色参数所对应的值,在这里先集中介绍, col1是黑色,2是粉红,3是绿色,4是天蓝,5是浅蓝,6是紫红,7是黄色,…...
PS人像处理磨皮插件
PS人像处理插件 Portraiture 人像照片进行自动磨皮和平滑处理Arcsoft Portrait 3 自动化人像磨皮软件 批量处理功能DR增强插件 含有磨皮滤镜Beautify Panel 高级质感磨皮插件PT Portrait 人像检测自动完成磨皮优化Retouch4me AI智能人能磨皮美容软件 1、Retouch4me_Heal…...
类型转换(C++)
一、C语言中的类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与 接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型 …...
2.23数据结构
单向循环链表 创建单向循环链表,创建节点 ,头插,按位置插入,输出,尾删,按位置删除功能 //main.c #include "loop_list.h" int main() {loop_p Hcreate_head();insert_head(H,12);insert_head(…...
c++笔记理解
1.封装 (1)构造函数不是必须在的 可以通过行为修改属性 (2)private和protected区别在于继承那里要学 (3)类默认是私有,struct是共有 私有的好处:控制数据的有效性,意…...
二进制部署k8s集群之cni网络插件
目录 k8s的三种网络模式 pod内容器之间的通信 同一个node节点中pod之间通信 不同的node节点的pod之间通信 flannel网络插件 flannel的三种工作方式 VxLAN host-GW UDP Flannel udp 模式 Flannel VXLAN 模式 flannel插件的三大模式的总结 calico网络插件 k8s 组网…...
二维矩阵子集的最大值
登录—专业IT笔试面试备考平台_牛客网 正好遇到了 对于一维,我们只需要贪一次 int ans -1E9; int suf -1E9; for (int i 0; i < n; i) {if (i && (a[i] - a[i - 1]) % 2 0) {suf 0;}suf std::max(suf, 0) a[i];ans std::max(ans, suf); } ans就是最大值…...
瑞_23种设计模式_装饰者模式
文章目录 1 装饰者模式(Decorator Pattern)1.1 介绍1.2 概述1.3 装饰者模式的结构 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 JDK源码解析5 总结5.1 装饰者模式的优缺点5.2 装饰者模式的使用场景5.3 装饰者模式 VS 代理模式 &#x…...
使用Python制作进度条有多少种方法?看这一篇文章就够了!
前言 偶然间刷到一个视频,说到:当程序正在运算时,会有一个较长时间的空白期,谁也不知道程序运行的进度如何,不如给他加个进度条。 于是我今个就搜寻一下,Python版的进度条都可以怎么写! 送书…...
SpringBoot-2.7.6基于SLF4J日志门面的日志框架切换
SpringBoot 没有强制性的日志记录依赖项,但 Commons Logging API 除外,它通常由 Spring Framework 的模块提供。 要使用 Logback,您需要将其包含在类路径中。 推荐的方法是您只需要通过启动器,这都取决于 . 对于 Web 应用程序 ,因为它可传递地依赖于日志记录启动器。 如果…...
MongoDB聚合运算符:$binarySize
$binarySize聚合运算符返回给定字符串或二进制数据的字节数。 语法 { $binarySize: <string or binData> }使用 <string or bindData>可以是任何能够被解析为字符串和二进制数据的表达式;如果表达式解析为null,则$binarySize也返回null&a…...
Android的ViewModel
前言 在Compose的学习中,我们在可组合函数中使用rememberSaveable保存应用数据,但这可能意味着将逻辑保留在可组合函数中或附近。随着应用体量不断变大,您应将数据和逻辑从可组合函数中移出。 而在之前的应用架构学习中&…...
告别激活弹窗:KMS_VL_ALL_AIO智能激活工具完全指南
告别激活弹窗:KMS_VL_ALL_AIO智能激活工具完全指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活烦恼吗?每次开机都看到"需要激活"的提…...
STM32F407通过SPI接口高效读写SD卡:CubeMX配置与底层驱动实战
1. SD卡基础与SPI通信原理 SD卡作为嵌入式系统中最常用的存储介质之一,其SPI模式因其接线简单、协议清晰而广受欢迎。先说说我实际项目中遇到的坑:曾经因为没理解清楚SPI模式下SD卡的初始化时序,导致整整两天卡在设备无法识别的困境里。 SD卡…...
开源自动驾驶系统终极指南:从入门到精通
开源自动驾驶系统终极指南:从入门到精通 【免费下载链接】openpilot openpilot is an operating system for robotics. Currently, it upgrades the driver assistance system on 300 supported cars. 项目地址: https://gitcode.com/GitHub_Trending/op/openpilo…...
基于Arduino与TSL2561的光照度测量系统:从硬件连接到软件调试
1. 项目概述:从园艺需求到嵌入式光测量方案最近在折腾一个园艺相关的项目,需要量化评估不同覆盖材料(比如遮阳网、塑料薄膜)对光线透射率的影响。说白了,就是想精确知道,盖上一层材料后,底下还能…...
可穿戴电子模块化连接方案:5mm微型按扣实现电路板与织物的可插拔连接
1. 项目概述与核心思路在折腾可穿戴电子项目时,最让人头疼的问题之一,就是如何让电路板与衣物既可靠连接,又能方便地拆下来。传统的做法要么是用导电胶带粘(不牢靠、易氧化),要么是直接把线焊死在板子上然后…...
别再拷贝exe到NXBIN了!用批处理文件搞定NX二次开发外部exe的环境变量(附VS2015/NX12配置)
告别手动拷贝:用批处理智能管理NX二次开发环境变量 每次修改完NX二次开发的外部exe程序,都要手动拷贝到NXBIN目录?这种重复劳动不仅低效,还容易导致版本混乱。其实只需一个简单的批处理脚本,就能彻底解决环境变量配置问…...
基于CircuitPython与NeoPixel打造可编程LED亚克力灯牌:从硬件选型到代码实现
1. 项目概述:打造你的专属可编程光之铭牌在创客和电子爱好者的世界里,总有一些项目能完美地融合软件编程的灵活性与硬件制作的实体成就感。今天要分享的,就是这样一个让我爱不释手的小玩意儿:一个基于CircuitPython和NeoPixel的可…...
数据分析师GitHub作品集构建指南:从项目架构到技术实现
1. 项目概述:一个数据分析师的作品集仓库意味着什么? 在数据驱动的时代,简历上的“精通Python/SQL”已经不够看了。面试官,尤其是那些懂行的技术面试官,更想看到的是你如何用这些工具解决真实世界的问题。这就是为什么…...
5分钟快速上手:PlantUML Editor - 告别拖拽,用代码绘制专业UML图表
5分钟快速上手:PlantUML Editor - 告别拖拽,用代码绘制专业UML图表 【免费下载链接】plantuml-editor PlantUML online demo client 项目地址: https://gitcode.com/gh_mirrors/pl/plantuml-editor 还在为绘制复杂的UML图表而烦恼吗?你…...
紧急更新!Midjourney刚推送的--stylize 1000级调优补丁,已实测提升立体主义结构清晰度达4.8倍(附对比数据集下载)
更多请点击: https://intelliparadigm.com 第一章:Midjourney立体主义风格的本质解构 立体主义并非简单地将物体“打碎再拼合”,而是一种对多维时空感知的视觉转译——Midjourney 通过其隐式扩散先验,以概率化方式重构了布拉克与…...
