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

虚拟机做局域网网站服务器2022年最新最有效的营销模式

虚拟机做局域网网站服务器,2022年最新最有效的营销模式,上海猎头公司招聘信息,六安网站制作金狮java 7.函数-递归在本文的第一部分中#xff0c;我们介绍了谓词#xff0c;这些谓词通过具有返回true或false的单一方法的简单接口#xff0c;为Java等面向对象的语言带来了函数式编程的某些好处。 在第二部分和最后一部分中#xff0c;我们将介绍一些更高级的概念#xf… java 7.函数-递归 在本文的第一部分中我们介绍了谓词这些谓词通过具有返回true或false的单一方法的简单接口为Java等面向对象的语言带来了函数式编程的某些好处。 在第二部分和最后一部分中我们将介绍一些更高级的概念以使您的谓词发挥最大作用。 测试中 谓词发光的一种明显情况是测试。 每当您需要测试将遍历数据结构和某些条件逻辑混合在一起的方法时通过使用谓词您可以隔离地测试每一半首先遍历数据结构然后遍历条件逻辑。 第一步您只需将始终为true或始终为false谓词传递给该方法即可摆脱条件逻辑而只专注于对数据结构的正确处理 // check with the always-true predicate final IterablePurchaseOrder all orders.selectOrders(Predicates.PurchaseOrder alwaysTrue()); assertEquals(2, Iterables.size(all));// check with the always-false predicate assertTrue(Iterables.isEmpty(orders.selectOrders(Predicates.PurchaseOrder alwaysFalse()))); 在第二步中您只需分别测试每个可能的谓词。 final CustomerPredicate isForCustomer1 new CustomerPredicate(CUSTOMER_1); assertTrue(isForCustomer1.apply(ORDER_1)); // ORDER_1 is for CUSTOMER_1 assertFalse(isForCustomer1.apply(ORDER_2)); // ORDER_2 is for CUSTOMER_2 这个例子很简单但是您可以理解。 为了测试更复杂的逻辑如果测试功能的每半部分还不够则可以创建模拟谓词例如一次返回true的谓词然后始终返回false。 由于严格分开关注点因此强制这样的谓词可能会大大简化您的测试设置。 谓词对于测试非常有用以至于如果您倾向于做一些TDD我的意思是说如果您可以通过测试的方式影响您的设计方式那么一旦您知道谓词它们肯定会在设计中找到自己的方式。 向团队解释 在我从事的项目中团队最初并不熟悉谓词。 但是这个概念很简单也很有趣每个人都可以快速上手。 事实上令我惊讶的是谓词的概念如何从我编写的代码自然传播到我的同事的代码中而没有太多的福音。 我想谓词的好处不言而喻。 从诸如Apache或Google之类的知名公司那里获得成熟的API也有助于说服它是严肃的东西。 现在有了功能性编程炒作它应该更容易出售 简单优化 通常的优化是使谓词尽可能不变和无状态 以使它们的共享无需考虑线程。 这样就可以在整个过程中使用一个实例作为一个实例例如作为静态最终常量。 如果需要可以在运行时缓存在编译时无法枚举的最常用谓词。 与往常一样仅当您的探查器报告确实需要它时才执行此操作。 可能的话谓词对象可以在其构造函数中自然是线程安全的或惰性地预先计算其评估所涉及的一些计算。 谓词应该是无副作用的 换句话说就是“只读”谓词的执行不应引起系统状态的任何可观察到的变化。 一些谓词必须具有某种内部状态例如用于分页的基于计数器的谓词但它们仍不得更改其所应用系统中的任何状态。 在内部状态下它们也无法共享但是如果它们支持每次连续使用之间的重置则可以在其线程内重用它们。 细粒度的界面谓词的受众范围更大 在大型应用程序中您会发现自己为完全不同的类型编写了非常相似的谓词但它们具有与客户相关的共同属性。 例如在管理页面中您可能希望按客户过滤日志 在CRM页面中您要按客户过滤投诉。 对于每个此类X您都需要另一个CustomerXPredicate来按客户对其进行过滤。 但是由于每个X都以某种方式与客户相关所以我们可以使用一种方法将其在Eclipse中提取接口分解为CustomerSpecific接口 public interface CustomerSpecific {Customer getCustomer(); } 这个细粒度的界面让我想起了某些语言的特质 但它没有可重用的实现。 它也可以看作是在静态类型语言中引入动态类型的一种方法因为它可以使用getCustomer 方法以不同的方式调用任何对象。 当然我们的类PurchaseOrder现在实现了此接口。 一旦有了该接口CustomerSpecific 就可以在其上定义谓词而不是像以前那样在每个特定类型上定义谓词。 这有助于在整个大型项目中利用几个谓词。 在这种情况下谓词CustomerPredicate与操作它的CustomerSpecific接口位于同一位置并且具有通用类型CustomerSpecific public final class CustomerPredicate implements PredicateCustomerSpecific, CustomerSpecific {private final Customer customer;// valued constructor omitted for claritypublic Customer getCustomer() {return customer;}public boolean apply(CustomerSpecific specific) {return specific.getCustomer().equals(customer);} } 请注意该谓词本身可以实现CustomerSpecific接口因此甚至可以对其进行评估 当使用类似特征的接口时您必须注意泛型并稍微更改类PurchaseOrders中需要Predicate PurchaseOrder的方法以便它也可以接受PurchaseOrder超类型的任何谓词 public IterablePurchaseOrder selectOrders(Predicate? super PurchaseOrder condition) {return Iterables.filter(orders, condition); } 域驱动设计规范 埃里克·埃文斯Eric Evans和马丁·福勒Martin Fowler一起编写了规范Specification 这显然是一个谓词。 实际上“谓词”一词是逻辑编程中使用的词并且编写了规范说明用于解释我们如何将逻辑编程的某些能力借用到面向对象的语言中。 在《域驱动设计》一书中埃里克·埃文斯Eric Evans详细介绍了这种模式并给出了几个规范的示例这些示例均表示域的各个部分。 就像本书描述的策略模式一样当将策略模式应用于域时仅是策略模式在某种意义上规范模式也可以被视为专用于领域方面的谓词版本其另外的目的是清楚地标记和标识该域。商业规则。 作为说明Specification模式中建议的方法名称为 isSatisfiedByTboolean 它重点关注域约束。 正如我们之前用谓词所见封装在Specification对象中的业务逻辑原子可以使用布尔逻辑或而不是全部逻辑重新组合就像在Interpreter模式中一样 。 该书还介绍了一些更高级的技术例如查询数据库或存储库时的优化以及使用。   查询时的优化 以下是优化技巧但我不确定您是否会需要它们。 但这确实是事实谓词在过滤数据集时相当笨拙必须仅对集合中的每个元素进行评估这可能会导致大型集合的性能问题。 如果将元素存储在数据库中并提供了谓词则通过谓词检索每个元素以逐个过滤它们对于大型集合来说似乎并不是一个正确的主意…… 当遇到性能问题时您可以启动分析器并找到瓶颈。 现在如果经常调用谓词从数据结构中过滤出元素是一个瓶颈那么如何解决呢 一种方法是摆脱完整的谓词然后回到硬编码更易于出错重复且测试较少的代码。 只要我能找到更好的替代方法来优化谓词我就会一直反对这种方法并且有很多选择。 首先深入了解代码的使用方式。 本着领域驱动设计的精神每当出现问题时就应该系统地寻找领域的洞察力。 通常系统中有明确的使用模式。 尽管统计它们为优化提供了巨大的机会。 例如在我们的PurchaseOrders类中检索每个PENDING订单的频率可能比其他情况要高得多因为在我们的虚构示例中从业务的角度来看这样做才有意义。 朋友共谋 根据使用模式您可以编写专门针对其优化的替代实现。 在我们经常查询待处理订单的示例中我们将编写一个替代实现FastPurchaseOrder 该实现使用一些预先计算的数据结构来使待处理订单准备就绪以便快速访问。 现在为了从这种替代实现中受益您可能很想更改其接口以添加专用方法例如selectPendingOrders 。 请记住在您只有通用的selectOrdersPredicate方法之前。 添加额外的方法在某些情况下可能还可以但是可能会引起一些问题您还必须在其他所有实现中都实现此额外的方法并且额外的方法可能对特定的用例而言过于具体因此可能不适用于接口。 通过仅期望谓词的完全相同的方法使用内部优化的技巧只是使实现认识到它所关联的谓词。 我称其为“ Friend Complicity ”是指C 中的friend关键字。 /** Optimization method: pre-computed list of pending orders */ private IterablePurchaseOrder selectPendingOrders() {// ... optimized stuff... }public IterablePurchaseOrder selectOrders(Predicate? super PurchaseOrder condition) {// internal complicity here: recognize friend class to enable optimizationif (condition instanceof PendingOrderPredicate) {return selectPendingOrders();// faster way}// otherwise, back to the usual casereturn Iterables.filter(orders, condition); } 显然它增加了两个实现类之间的耦合否则它们应该彼此忽略。 同样如果直接给«friend»谓词且周围没有装饰器或合成器则它只会对性能有所帮助。 Friend Complicity真正重要的是确保方法的行为永不妥协无论是否进行优化都必须始终满足接口的约定只是性能改进可能会或不会发生。 另外请记住您可能有一天可能要切换回未经优化的实施。   SQL受损 如果订单实际上存储在数据库中则可以使用SQL快速查询它们。 顺便说一句您可能已经注意到谓词的概念恰好是您在SQL查询中的WHERE子句之后放置的。 仍然使用谓词并提高性能的第一种简单方法是使某些谓词实现附加接口SqlAware 方法为asSQLString 该字符串返回与谓词本身的评估相对应的确切SQL查询 。 当对数据库支持的存储库使用谓词时存储库将调用此方法而不是通常的validatePredicate或applyPredicate方法然后使用返回的查询来查询数据库。 我称这种方法是SQL受损的因为谓词现在已被特定于数据库的详细信息所污染因此应该更经常地忽略它。 直接使用SQL的替代方法包括使用存储过程或命名查询 谓词必须提供查询的名称及其所有参数。 在存储库和传递给它的谓词之间进行双调度也是一种选择存储库在其附加方法selectElementsthis上调用谓词该方法本身又调用正确的预选择方法findByStatestate存储库中的Collection 谓词然后对返回的集合应用其自己的过滤并返回最终的过滤集合。 包容性 包含是一个逻辑概念用于表达一个概念包含另一个概念的关系例如“红色绿色和黄色包含在术语颜色下” Merriam-Webster 。 谓词之间的包含可能是在代码中实现的非常强大的概念。 让我们以广播股票报价的应用程序为例。 注册时我们必须声明我们有兴趣观察哪些报价。 我们可以通过简单地传递一个只对我们感兴趣的股票评估为真的股票谓词来做到这一点 public final class StockPredicate implements PredicateString {private final SetString tickers;// Constructors omitted for claritypublic boolean apply(String ticker) {return tickers.contains(ticker);}} 现在我们假设该应用程序已经广播了有关消息传递主题的标准的流行行情设置并且每个主题都有自己的谓词。 如果它可以检测到我们要使用的谓词是“包括”或包含在标准谓词之一中则可以订阅它并保存计算。 在我们的案例中通过简单地在谓词上添加其他方法这种包含就相当容易了 public boolean encompasses(StockPredicate predicate) {return tickers.containsAll(predicate.tickers);} 包含是关于评估“包含”的另一个谓词 。 当谓词基于示例如示例或基于数字或日期的间隔时这很容易。 否则您可能不得不诉诸类似于Friend Complicity的技巧即以个案的方式识别另一个谓词以决定是否包含该谓词。 总体而言请记住一般情况下很难实现包容但是即使部分包容也可能非常有价值因此它是工具箱中的重要工具。 结论 谓词很有趣并且可以增强您的代码和您的思考方式 干杯 该部分的单个源文件可下载cyriux_predicates_part2.zip固定的损坏链接 参考 带有谓词的纯Java语言中的函数式风格– Cyrille Martraire博客博客中来自JCG合作伙伴 Cyrille Martraire的第二部分 。 翻译自: https://www.javacodegeeks.com/2012/05/functional-style-in-java-with_23.htmljava 7.函数-递归
http://icebutterfly214.com/news/11001/

相关文章:

  • 亲爱的伊利斯
  • MySQL_进阶
  • 2025-11-02 闲话
  • 国产化数据库迁移工具不会用?教你手搓一个万能数据迁移工具。
  • C++练习1
  • 第二届数证杯初赛-计算机取证
  • puty总是自动断开连接,修改配置即可
  • 题解:CF1037E Trips
  • 2025 CSP-S 游记
  • java 基础语法一
  • CSP-S游记
  • csp2025 总结
  • 使用Stream API重构你的数据处理
  • 一个灵感:思维的断章
  • 通达信:引用函数 - Leone
  • 20231427田泽航第七周预习报告
  • Awesome Neovim - 精选Neovim插件大全
  • 游记 CSP-S2025
  • 解码LVGL样式
  • Edge---浏览器优化配置
  • 打造你自己的 Linux 备份命令:快速、高效、易用 【from claude.ai Haiku 4.5】
  • pdf下载网站
  • 2025 年 11 月氨糖软骨素厂家哪家好?剂型优化与人群适配双维度测评推荐
  • range()
  • 2025 年 11 月氨糖软骨素厂家哪家好?提纯工艺与长效养护双核心测评推荐
  • 基于嵌入式无人机UAV通信系统的实时最优资源分配算法matlab仿真
  • 构建现代Web应用:使用React框架打造单页面应用
  • 完全背包内外循环是否能对调?
  • 《密码系统设计》第九周预习
  • 回归 CSP-S2025游记