读Java8函数式编程笔记07_设计和架构的原则

Java 中的函数式编程探索 Java自Java8起通过引入Lambda表达式、函数接口和StreamsAPI,开始支持函数式编程(FP),尽管其设计根植于1990年代的硬件限制,导致在实现FP时面临挑战。Java的默认可变性与FP的不可变性原则相冲突,且其类型系统和集合设计对FP构成限制。然而,Java通过高阶函数、递归、闭包、惰性求值和柯里化等技术 阅读详情

 

1. SOLID原则

1.1. 开发良好面向对象程序的准则

1.2. Liskov substitution里氏替换

1.3. Interface segregation接口隔离

1.4. Single responsibility单一功能原则

1.4.1. 程序中的类或方法只能有一个改变的理由

1.4.2. 一个类不仅要功能单一,而且还需将功能封装好

1.5. Open/closed开闭原则

1.5.1. 软件应该对扩展开放,对修改闭合

1.5.1.1. 让软件易于修改

1.5.2. 高阶函数在用多态来实现开闭原则

1.5.3. 使用不可变对象实现开闭原则

1.6. Dependency inversion依赖反转原则

1.6.1. 抽象不应依赖细节,细节应该依赖抽象

1.6.1.1. 待依赖的抽象不必是接口

1.6.2. 让程序员脱离底层粘合代码,编写上层业务逻辑代码

1.6.3. 高阶函数提供了反转控制

1.6.4. 模块化和重用方式是双向的

1.6.4.1. 可以替换不同的细节重用上层代码

1.6.4.2. 可以替换不同的业务逻辑重用细节的实现

2. 不可变性

2.1. 观测不可变性

2.1.1. 在其他对象看来,该类是不可变的

2.1.2. java.lang.String

2.1.2.1. 第一次调用hashCode方法时缓存了生成的散列值

2.1.3. 观测不可变性不意味着实现不可变性

2.2. 实现不可变性

2.2.1. 对象本身不可变

2.2.2. 实现不可变性意味着观测不可变性

3. 设计模式

3.1. 有些模式会变得过时

3.2. Lambda能让很多现有设计模式更简单、可读性更强

3.2.1. 将大量代码塞进一个方法会让可读性变差是决定如何使用Lambda表达式的黄金法则

4. 单例模式

4.1. 应该避免使用的模式

4.2. 敏捷开发使其成了一个反模式

5. 命令者模式

5.1. 命令者是一个对象,它封装了调用另一个方法的所有细节

5.2. 使用该对象,可以编写出根据运行期条件,顺序调用方法的一般化代码

5.3. 函数接口Runnable

5.4. 宏只是使用命令者模式的一个例子,它被大量用在实现组件化的图形界面系统、撤销功能、线程池、事务和向导中

5.5. 使用Lambda表达式或是方法引用,能让代码更简洁,去除了大量样板代码,让代码意图更加明显

6. 策略模式

6.1. 能在运行时改变软件的算法行为

6.2. 定义一个通用的问题,使用不同的算法来实现,然后将这些算法都封装在一个统一接口的背后

6.3. 使用Lambda表达式或者方法引用可以去掉样板代码

7. 观察者模式

7.1. 可被Lambda表达式简化和改进的行为模式

7.2. 被观察者持有一个观察者列表。当被观察者的状态发生改变,会通知观察者。

7.3. 观察者模式被大量应用于基于MVC的GUI工具中,以此让模型状态发生变化时,自动刷新视图模块,达到二者之间的解耦

8. 模板方法模式

8.1. 整体算法的设计是一个抽象类,它有一系列抽象方法,代表算法中可被定制的步骤,同时这个类中包含了一些通用代码

8.2. 算法的每一个变种由具体的类实现,它们重写了抽象方法,提供了相应的实现

8.3. 将一组方法调用按一定顺序组织起来

8.4. 如果用函数接口表示函数,用Lambda表达式或者方法引用实现这些接口,相比使用继承构建算法,就会得到极大的灵活性

8.4.1. 使用函数接口实现方法并没有排除继承的方式

9. 领域专用语言(DSL)

9.1. 针对软件系统中某特定部分的编程语言

9.1.1. 比较小巧

9.1.2. 表达能力也不如通用语言强

9.1.3. 不求面面俱到,但求有所专长

9.2. Domain-Specific Languages

9.2.1. Martin Fowler和Rebecca Parsons合著

9.2.2. Addison-Wesley出版社出版

9.3. 外部DSL

9.3.1. 脱离程序源码编写,然后单独解析和实现

9.3.2. 例如

9.3.2.1. 级联样式表(CSS)

9.3.2.2. 正则表达式

9.4. 内部DSL

9.4.1. 嵌入编写它们的编程语言中

9.4.2. 普通的类库,提供API方便使用

9.4.3. 例如

9.4.3.1. JMock

9.4.3.2. Mockito

9.4.3.3. JOOQ

9.4.3.4. Querydsl

10. 行为驱动开发(BDD)

10.1. 测试驱动开发(TDD)的一个变种

10.2. 它的重点是描述程序的行为,而非一组需要通过的单元测试

函数式编程-Stream流 能够看懂公司里的代码大数量下处理集合效率高代码可读性高消灭嵌套地狱。 阅读详情

相关推荐

《Java8实战》笔记(14):函数式编程的技巧

理解递归式Stream的思想.limit(n);不过这一方案看起来有些笨拙:你每次都需要遍历每个数字,查看它能否被候选数字整除(实际上,你只需要测试那些已经被判定为质数的数字)。理想情况下,Stream应该实时地筛选掉那些能被质数整除的数字。这听起来有些异想天开,不过我们一起看看怎样才能达到这样的效果。你需要一个由数字构成的Stream,你会在其中选择质数。你会从该Stream中取出第一个数字(即Stream的首元素),它是一个质数(初始时,这个值是2)。

2301_82242251的博客 509

一个 /v1 叠出每月 74 亿免费 token:FreeLLMAPI 免费 LLM API 网关本地部署完整指南

你想让 Claude Code、Codex CLI 或自己的小脚本用免费额度跑起来,就得分别注册 Google、Groq、Mistral,再手写一堆 SDK 调用和限流处理。FreeLLMAPI 是个自托管的免费 LLM API 网关:把各家提供商的密钥都丢给它,所有请求只走一个 OpenAI 兼容的 `/v1` 端点。 ## 🧭 它是什么 一句话定位:把 34 家提供商、635 个免费模型

gitblog_00983的博客 852

Java8函数式编程阅读

附上原文档。

qq_38077040的博客 1214

Java8函数式编程_8--设计和架构的原则

1,免责声明,本文大部分内容摘自《Java8函数式编程》。在这本书的基础上,根据自己的理解和网上一些博文,精简或者修改。本次分享的内容,只用于技术分享,不作为任何商业用途。当然这本书是非常值得一读,强烈建议买一本! 2,本次分享的样例代码均上传到github上,请点击这里。 注意:本章所有的例子大多围绕 1.3 节介绍的案例展开(音乐)。 Lambda 表达式是对 Java 语言的一点简单改进,在 JDK 标准类库中,运行它的方式各种各样。但是大多数 Java 代码都不是由开发 JDK 的程序员写的, 而是

Logan的专栏 800

TI毫米波雷达人体生命体征(呼吸、心跳)信号提取算法(IWR6843ISK+DCA1000EVM)

本篇内容介绍的算法主要为传统的提取算法,但可实现在1m内呈现良好的检测效果,能够提取出非常可观的呼吸和心跳波形,但在超出1m的距离后便不适用这个算法了。远距离检测呼吸和心跳始终是这个领域一个很大的挑战。要实现远距离检测可在提取相位信号、分离呼吸和心跳信号上进行改进处理,例如线性解调提取相位、改进的VMD分离呼吸和心跳算法。

m0_61934621的博客 3万+

FunASR语音识别服务在Win11上的Docker部署避坑指南:模型配置与热词优化

本文详细介绍了在Windows 11系统上通过Docker部署FunASR语音识别服务的完整流程,包括环境准备、模型配置、热词优化及常见问题解决方案。特别针对Win11环境下的特殊配置和性能调优提供了实用指南,帮助开发者高效搭建高性能语音识别服务。

e3f4g5的博客 222

Java函数式编程

Java函数式编程 初探函数式编程【JavaScript篇】哔哩哔哩bilibili 三更草堂Up主。不会Lambda表达式、函数式编程?你确定能看懂公司代码?-java8函数式编程(Lambda表达式,Optional,Stream流)从入门到精通-最通俗易懂_哔哩哔哩_bilibili 项目地址:bearbrick0/FuncProgram: 👀Java函数式编程的demo (github.com) 什么是函数式编程 为什么要学习函数式编程

- 7129

热膨胀系数(CTE)的不同处理方法对于封装翘曲仿真的影响

随着技术的不断发展,芯片封装的集成度越来越高,尺寸也越来越大,随之而来的封装翘曲问题也越来越引起关注。影响芯片封装翘曲最主要的原因就是封装中不同材料热膨胀系数(CTE)的失配性,因此在进行封装翘曲仿真的过程中,如何使用材料的CTE值就变得尤为重要,会对仿真精度产生较大的影响。本文将对比不同CTE的处理方法给仿真结果带来的影响。

wangyubo1的博客 6857

Java8函数式编程

文章目录Java8函数式编程简介什么是函数式编程Lambda表达式引用值,而不是变量函数接口类型推断流常用的流操作生成流collect(toList())返回集合map将一个流中的值转为另一个新的流filter方法过滤元素flatMapmax和minreduce操作整合操作高阶函数PredicateFunctionBinaryOperator练习类库基本类型重载解析@FunctionalInter...

guanhang89的专栏 2944

AF3 ProteinDataset类的_patch方法解读

AlphaFold3 protein_dataset模块 ProteinDataset 类  _patch 方法的主要目的是围绕锚点残基(anchor residues)裁剪蛋白质数据,提取一个局部补丁(patch)作为模型输入。

qq_27390023的博客 1148

Win10系统内存占用异常飙升?三步排查法快速定位问题根源

本文针对Win10系统内存占用异常飙升问题,提供了一套三步排查法。首先利用任务管理器和资源监视器进行深度系统体检,定位隐形内存消耗者;其次通过干净启动和禁用非必要后台服务,揪出导致内存泄漏的第三方软件或驱动;最后进行终极深度清理,包括检查内存完整性、调整虚拟内存设置以及更新关键驱动程序,帮助用户快速恢复系统流畅运行。

weixin_29251567的博客 196

Java函数式编程入门

函数式编程在Java中不仅能提高代码的简洁性和可读性,还能在处理数据流、并行计算等场景中发挥重要作用。通过掌握Lambda表达式、Stream API、Optional以及其他相关技术,并结合实际业务场景的应用,你将能够更高效地开发出安全、稳定和可维护的系统。建议在日常项目中逐步引入函数式编程思想,从简单的集合操作开始,逐步探索更多高级特性,并结合代码评审和测试不断完善实践经验。/*** 函数式编程*//*** Function<T, R>:接受T类型的参数,返回R类型的结果。

zjh285077371的专栏 1779

亚马逊广告接口 amazon advertising

亚马逊广告接口官方说明:https://advertising.amazon.com/API/docs/en-us/setting-up/account-setup 一:注册aws开发者账号 注册地址:https://developer.amazon.com 二:填写注册资料 三:进入控制台,生成安全配置文件 进入 Login with Amazon 菜单: 创建配置文件: 四:申请广告接入权限 申请地址:https://advertising.amazon.com/zh-cn/about-api

lzy66666的博客 4776

JAVA函数式编程

JAVA函数式编程背景常见的编程范式函数式编程的优劣JAVA8中为函数式编程引入的变化JAVA函数式编程可以简单概括基本函数Lambda表达式方法引用Stream流API创建操作中间操作终止从操作并行流级联表达式与柯里化收集器(终止操作因为内容较多提出来说明)Stream特性工程地址 背景 JAVA版本最新的目前已经发布到11了,但目前市面上大多数公司依然在使用Java7之前版本的语法,然而这些编...

qq_33168734的博客 1万+

【AI大模型:前沿】44、大模型+机器人:从自动化工具到通用智能体的技术革命与应用全景

大模型与机器人的融合催生了“具身智能体”,突破传统机器人智能化缺失、功能单一等瓶颈。大模型赋予机器人三大能力:常识推理(如热牛奶需去包装)、模糊指令解析(如“整理书桌”拆解步骤)、零样本任务泛化(如搭乐高桥)。技术实现上,通过多模态融合(视觉-语言-动作)、仿真训练(虚拟试错)和实时反馈(动态调整动作)形成闭环。主流框架如Google RT-2(端到端动作生成)、斯坦福Q-Transformer(强化学习优化)和Figure 01(ChatGPT驱动人形机器人)各具优势,可适配工业、家庭等场景。该技术正重塑

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 2020

6、掌握 CorelDRAW:从基础操作到创意绘图

本文详细介绍了CorelDRAW的基础操作与创意绘图技巧,涵盖软件使用注意事项、常用快捷键、全局与局部设置的区别、Dockers面板的高效使用,并通过绘制带星星图案的球实例,逐步演示了对象创建、编辑、复制、分布优化、元素添加、颜色与特效调整等核心功能,最后讲解了作品的保存与输出方法,帮助用户从入门到进阶掌握CorelDRAW的设计流程。

snow3的博客 122

java8 函数式编程 pdf_java8函数式编程 pdf

java8函数式编程 pdf的重要性就不言而喻了吧。对于每一个JAVA开发者,这都是一个必过的坎。虽然现在的主流编程方式还是面向对象式。当然也不能否认这种方式的健壮性,可扩展性。但是随着编程技术的发展。走在时代前列的函数式编程就粉墨登场了。而这本java8函数式编程就全面介绍了函数式编程的精华,对于很多这种全新的编程理念,大家绝对有必要阅读学习一下。对于JAVA的发展道路非常的有帮助。而这本书主要...

weixin_34277895的博客 1079

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java 8 函数式编程的技巧

本篇内容 一等成员、高阶方法、科里化以及局部应用 持久化数据结构 生成Java Stream 时的延迟计算和延迟列表 模式匹配以及如何在Java中应用 应用透明性和缓存 1.无处不在的函数    在前一篇中我们使用术语“函数式编程”意指函数或者方法的行为应该像“数学函数”一样——没有任何副作用。对于使用函数式语言的程序员而言,这个术语的范畴更加宽泛,它还意味着函数可以像任何其他值一样随意使用:可以作为参数传递,可以作为返回值,还能存储在数据结构中。能够像普通变量一样使用.

java大神起床啦 4万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

软件架构设计的七大原则

1、开闭原则 开闭原则(Open-Closed Principle, OCP)是指一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。所谓的开闭,也正是对扩展和修改两个行为的一个原则。强调的是用抽象构建框架,用实现扩展细节。可以提高软件系统的可复用性及可维护性。开 闭原则,是面向对象设计中最基础的设计原则。它指导我们如何建立稳定灵活的系统,例如:我们版本更新,我尽可能不修改源代码,但是可以增...

通往神秘的道路的专栏 2万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java 8 函数式的思考

本篇内容 为什么要进行函数式编程 什么是函数式编程 声明式编程以及引用透明性 编写函数式Java的准则 迭代和递归 1.实现和维护系统 1.1 共享的可变数据    最终,我们刚才讨论的无法预知的变量修改问题,都源于共享的数据结构被你所维护的代码中的多个方法读取和更新。假设几个类同时都保存了指向某个列表的引用。那么到底谁对这个列表拥有所属权呢?如果一个类对它进行了修改,会发生什么情况?其他的类预期会发生这种变化吗?其他的类又如何得知列表发生了修改呢?我们需要通知使用该列.

java大神起床啦 4万+

Java函数式编程学习笔记

JDK8的函数式编程

qq_51313170的博客 1040

Java8-函数式编程

(3)distinct:注意 distinct()方法是依赖Object的equals方法来判断是否是相同对象的,所以注意重写自定义对象的equals方法。reduce的作用是把Stream中的元素给组合起来,我们可以传入一个初始值,它会按照我们的计算方式依次拿流中的元素和在初始化值的基础上进行计算,计算结果再和后面的元素计算。(7)flatMap:map只能把一个对象转成另一个对象来作为流中的元素,而flatMap可以把一个对象转换成多个对象作为流中的元素。3、方法体只有一个参数时,小括号可以省略。

m0_73246365的博客 930

Java函数式编程与泛型用法

简化代码,就是把逻辑和控制分开先说总结,函数式解决对于状态的依赖,泛型,解决对于类型的依赖。

eck_燃的博客 1319

java8新特性——函数式编程

Lambda表达式是JDK8中一个语法糖,它可以对某些匿名内部类的写法进行简化。它是函数式编程思想的一个重要体现,让我们不用关注是什么对象,而是关注我们对数据进行了什么操作。Java8的Stream使用的是函数式编程模式,它可以被用来对集合或数组进行链状流式的操作,可以更方便的让我们对集合或数组操作。我们在编写代码的时候出现最多的就是空指针异常,所以在很多情况下我们需要做各种非空的判断。尤其是对象中的属性还是一个对象的情况下,这种判断会更多。= null) {}

qq_52030824的博客 1468

Java 函数式编程与事件驱动模式

Java 函数式编程入门函数式编程实战改进   像 JavaScript 这种语言很早就支持闭包了,虽然 C++ 很早就有了函数指针,Java 也很早就提供了反射中的 Method 类,不过使用它们都不能算是真正的函数式编程(面向函数编程)。原因它们还不够方便和优雅。编程语言是为人类设计的语言,如果仅仅为了可实现,那任何编程思想、设计模式、架构模式都没有意义。   Java 从 Java 8 开始支持 lambda 表达式,这才算是支持函数式编程。函数式编程有什么好处呢?如果将其与依赖注入技术结合,可以很好

暗诺星刻的博客 2514
上一篇: 读Java8函数式编程笔记06_Lambda表达式编写并发程序
下一篇: 读Java8函数式编程笔记08_测试、调试和重构
躺柒
博客等级 码龄4年 7004粉丝 1321原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值