当前位置: 首页 > news >正文

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->Rcompose(before)、andThen(after)IntFunction、ToIntFunction、IntToLongFunction
Consumervoid accept(T t)T->voidandThen(after)IntConsumer
Predicateboolean test(T t)T->booleanand、negate、orIntPredicate
SupplierT get()*->TIntSupplier、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)->RandThen(Function after)ToIntBiFunction<T, U>
BiConsumer<T, U>void accept(T t, U u)(T、U)->voidandThen(after)ObjIntConsumer
BiPredicate<T, U>boolean test(T t, U u)(T、U)->booleanand、negate、or

扩展的运算符

UnaryOperator<T>
  • 一元运算符(单个操作数,生产与操作数类型相同的结果)
  • 继承自Function<T, T>
  • 基本类型的运算符:IntUnaryOperator、LongUnaryOperator、DoubleUnaryOperator
BinaryOperator<T>
  • 二元运算符(两个相同类型的操作数,生产与操作数类型相同的结果)
  • 继承自BiFunction<T, T, T>
  • 基本类型的运算符:IntBinaryOperator、LongBinaryOperator、DoubleBinaryOperator
运算符父类组合方法基本类型专用类
UnaryOperatorFunction<T, T>IntUnaryOperator: int applyAsInt(int operand)
BinaryOperatorBiFunction<T, T, T>minBy、maxByIntBinaryOperator: 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 我自己的理解&#xff0c;函数式编程对用户最大的价值是促使开发者养成模块化编程的习惯&#xff0c;代码可读性和维护性提高很多。 通过阅读JDK 8的 java.util.function 和 java.util.stream 包源码&#xff0c;意在理解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端提供的服务&#xff0c;所以在消费端并没有服务公共接口的实现类。 使用过程中利用注解DubboReference将目标接口作为某个类的字段属性&#xff0c;在解析该类时获取全部字段属性并单独关注解析存在注解DubboReference的字段属性。通过步…...

报表控件Stimulsoft 新版本2024.1中,功能区工具栏新功能

今天&#xff0c;我们将讨论Stimulsoft Reports、Dashboards 和 Forms 2024.1版本中的一项重要创新 - 在一行中使用功能区工具栏的能力。 Stimulsoft Ultimate &#xff08;原Stimulsoft Reports.Ultimate&#xff09;是用于创建报表和仪表板的通用工具集。该产品包括用于WinF…...

零样本带解释性的医学大模型

带解释性的医学大模型 提出背景解法拆解方法的原因对比以前解法 零样本带解释性的医学大模型如何使用CLIP模型和ChatGPT来进行零样本医学图像分类用特定提示查询ChatGPT所生成的医学视觉特征描述相似性得分在不同症状上的可视化&#xff0c;用于解释模型的预测注意力图的可视化…...

英文输入法(C 语言)

题目来自于博主算法大师的专栏&#xff1a;最新华为OD机试C卷AB卷OJ&#xff08;CJavaJSPy&#xff09; https://blog.csdn.net/banxia_frontend/category_12225173.html 题目 主管期望你来实现英文输入法单词联想功能&#xff0c;需求如下&#xff1a; 依据用户输入的单词前…...

万众一心 · 喜赢未来,2023宇凡微年会暨阳朔之旅

​宇凡微 万众一心 喜赢未来 2024宇凡微年会暨阳朔之旅 在一起&#xff0c;做时间的朋友&#xff0c;迈向第一 前言 INTRODUCTION 感恩宇凡微过去七年砥砺路&#xff0c;携手宇凡微未来七年新征程。2024年1月24日~1月27日&#xff0c;宇凡微在广西桂林阳朔举办了以“感恩有…...

【Spring】 AOP面向切面编程

文章目录 AOP是什么&#xff1f;一、AOP术语名词介绍二、Spring AOP框架介绍和关系梳理三、Spring AOP基于注解方式实现和细节3.1 Spring AOP底层技术组成3.2 初步实现3.3 获取通知细节信息3.4 切点表达式语法3.5 重用&#xff08;提取&#xff09;切点表达式3.6 环绕通知3.7 切…...

R语言入门笔记2.6

描述统计 分类数据与顺序数据的图表展示 为了下面代码便于看出颜色参数所对应的值&#xff0c;在这里先集中介绍&#xff0c; col1是黑色&#xff0c;2是粉红&#xff0c;3是绿色&#xff0c;4是天蓝&#xff0c;5是浅蓝&#xff0c;6是紫红&#xff0c;7是黄色&#xff0c;…...

PS人像处理磨皮插件

PS人像处理插件 Portraiture 人像照片进行自动磨皮和平滑处理Arcsoft Portrait 3 自动化人像磨皮软件 批量处理功能DR增强插件 含有磨皮滤镜Beautify Panel 高级质感磨皮插件PT Portrait 人像检测自动完成磨皮优化Retouch4me AI智能人能磨皮美容软件 1、Retouch4me_Heal…...

类型转换(C++)

一、C语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或者返回值类型与 接收返回值类型不一致时&#xff0c;就需要发生类型转化&#xff0c;C语言中总共有两种形式的类型转换&#xff1a;隐式类型 …...

2.23数据结构

单向循环链表 创建单向循环链表&#xff0c;创建节点 &#xff0c;头插&#xff0c;按位置插入&#xff0c;输出&#xff0c;尾删&#xff0c;按位置删除功能 //main.c #include "loop_list.h" int main() {loop_p Hcreate_head();insert_head(H,12);insert_head(…...

c++笔记理解

1.封装 &#xff08;1&#xff09;构造函数不是必须在的 可以通过行为修改属性 &#xff08;2&#xff09;private和protected区别在于继承那里要学 &#xff08;3&#xff09;类默认是私有&#xff0c;struct是共有 私有的好处&#xff1a;控制数据的有效性&#xff0c;意…...

二进制部署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 装饰者模式&#xff08;Decorator Pattern&#xff09;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制作进度条有多少种方法?看这一篇文章就够了!

前言 偶然间刷到一个视频&#xff0c;说到&#xff1a;当程序正在运算时&#xff0c;会有一个较长时间的空白期&#xff0c;谁也不知道程序运行的进度如何&#xff0c;不如给他加个进度条。 于是我今个就搜寻一下&#xff0c;Python版的进度条都可以怎么写&#xff01; 送书…...

SpringBoot-2.7.6基于SLF4J日志门面的日志框架切换

SpringBoot 没有强制性的日志记录依赖项,但 Commons Logging API 除外,它通常由 Spring Framework 的模块提供。 要使用 Logback,您需要将其包含在类路径中。 推荐的方法是您只需要通过启动器,这都取决于 . 对于 Web 应用程序 ,因为它可传递地依赖于日志记录启动器。 如果…...

MongoDB聚合运算符:$binarySize

$binarySize聚合运算符返回给定字符串或二进制数据的字节数。 语法 { $binarySize: <string or binData> }使用 <string or bindData>可以是任何能够被解析为字符串和二进制数据的表达式&#xff1b;如果表达式解析为null&#xff0c;则$binarySize也返回null&a…...

Android的ViewModel

前言 在Compose的学习中&#xff0c;我们在可组合函数中使用rememberSaveable​​​​​​​保存应用数据&#xff0c;但这可能意味着将逻辑保留在可组合函数中或附近。随着应用体量不断变大&#xff0c;您应将数据和逻辑从可组合函数中移出。 而在之前的应用架构学习中&…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

MySQL 主从同步异常处理

阅读原文&#xff1a;https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主&#xff0c;遇到的这个错误&#xff1a; Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一&#xff0c;通常表示&#xff…...

WebRTC调研

WebRTC是什么&#xff0c;为什么&#xff0c;如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...