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

如何做网站条幅闪图凡科与wordpress

如何做网站条幅闪图,凡科与wordpress,2024舆情信息范例8篇,seo免费资源大全java 函数式编程 示例这是第8部分#xff0c;该系列的最后一部分称为“示例功能Java”。 我在本系列的每个部分中开发的示例是某种“提要处理程序”#xff0c;用于处理文档。 在上一期文章中#xff0c;我们已经使用Vavr库看到了一些模式匹配#xff0c;并且还将故障也视… java 函数式编程 示例 这是第8部分该系列的最后一部分称为“示例功能Java”。 我在本系列的每个部分中开发的示例是某种“提要处理程序”用于处理文档。 在上一期文章中我们已经使用Vavr库看到了一些模式匹配并且还将故障也视为数据 例如采用了替代路径并返回到功能流程。 在本系列的最后一篇文章中我将功能发挥到了极致 一切都变成了功能。 如果您是第一次来最好是从头开始阅读。 它有助于了解我们从何处开始以及如何在整个系列中继续前进。 这些都是这些部分 第1部分–从命令式到声明式 第2部分–讲故事 第3部分–不要使用异常来控制流程 第4部分–首选不变性 第5部分–将I / O移到外部 第6部分–用作参数 第7部分–将失败也视为数据 第8部分–更多纯函数 我将在每篇文章发表时更新链接。 如果您通过内容联合组织来阅读本文请查看我博客上的原始文章。 每次代码也被推送到这个GitHub项目 。 最大化运动部件 您可能已经听过Micheal Feathers的以下短语 OO通过封装运动部件使代码易于理解。 FP通过最大程度地减少运动部件来使代码易于理解。 好的让我们稍稍忘记上一期中的故障恢复然后继续下面的版本 FeedHandler { class FeedHandler { ListDoc handle(ListDoc changes, FunctionDoc, TryResource creator) { changes .findAll { doc - isImportant(doc) } .collect { doc - creator.apply(doc) }.map { resource - setToProcessed(doc, resource) }.getOrElseGet { e - setToFailed(doc, e) } } } private static boolean isImportant(doc) { doc.type important } private static Doc setToProcessed(doc, resource) { doc.copyWith( status: processed , apiId: resource.id ) } private static Doc setToFailed(doc, e) { doc.copyWith( status: failed , error: e.message ) } } 替换为功能类型 我们可以使用对函数接口类型的变量例如Predicate或BiFunction的引用来替换每种方法。 A我们可以替换一个接受1个参数的方法该方法返回一个布尔值 。 private static boolean isImportant(doc) { doc.type important } 由谓词 private static PredicateDoc isImportant { doc - doc.type important } B我们可以替换一个接受2个参数并返回结果的方法 private static Doc setToProcessed(doc, resource) { ... } private static Doc setToFailed(doc, e) { ... } 具有BiFunction private static BiFunctionDoc, Resource, Doc setToProcessed { doc, resource - ... } private static BiFunctionDoc, Throwable, Doc setToFailed { doc, e - ... } 为了实际调用封装在BiFunction中的逻辑我们必须对其调用apply 。 结果如下 FeedHandler { class FeedHandler { ListDoc handle(ListDoc changes, FunctionDoc, TryResource creator) { changes .findAll { isImportant } .collect { doc - creator.apply(doc) .map { resource - setToProcessed.apply(doc, resource) }.getOrElseGet { e - setToFailed.apply(doc, e) } } } private static PredicateDoc isImportant { doc - doc.type important } private static BiFunctionDoc, Resource, Doc setToProcessed { doc, resource - doc.copyWith( status: processed , apiId: resource.id ) } private static BiFunctionDoc, Throwable, Doc setToFailed { doc, e - doc.copyWith( status: failed , error: e.message ) } } 将所有输入移至功能本身 我们将所有内容移至方法签名以便FeedHandler的handle方法的调用者可以提供自己的那些功能的实现。 方法签名将更改为 ListDoc handle(ListDoc changes, FunctionDoc, TryResource creator) 至 ListDoc handle(ListDoc changes, FunctionDoc, TryResource creator, PredicateDoc filter, BiFunctionDoc, Resource, Doc successMapper, BiFunctionDoc, Throwable, Doc failureMapper) 其次我们将重命名原始静态 谓词和BiFunction变量 isImportant setToProcessed setToFailed 转换为类顶部的新常量 反映它们的新作用。 DEFAULT_FILTER DEFAULT_SUCCESS_MAPPER DEFAULT_FAILURE_MAPPER 客户端可以完全控制是否将默认实现用于某些功能或者何时需要接管自定义逻辑。 例如当仅需要定制故障处理时可以这样调用handle方法 BiFunctionDoc, Throwable, Doc customFailureMapper { doc, e - doc.copyWith( status: my-custom-fail-status , error: e.message ) } new FeedHandler().handle(..., FeedHandler.DEFAULT_FILTER, FeedHandler.DEFAULT_SUCCESS_MAPPER, customFailureMapper ) 如果您的语言支持则可以通过分配默认值来确保客户端实际上不必提供每个参数。 我正在使用支持将默认值分配给方法中的参数的Apache Groovy ListDoc handle(ListDoc changes, FunctionDoc, TryResource creator, PredicateDoc filter DEFAULT_FILTER, BiFunctionDoc, Resource, Doc successMapper DEFAULT_SUCCESS_MAPPER, BiFunctionDoc, Throwable, Doc failureMapper DEFAULT_FAILURE_MAPPER) 在我们将应用另一个更改之前请看一下代码 FeedHandler { class FeedHandler { private static final PredicateDoc DEFAULT_FILTER { doc - doc.type important } private static final BiFunctionDoc, Resource, Doc DEFAULT_SUCCESS_MAPPER { doc, resource - doc.copyWith( status: processed , apiId: resource.id ) } private static final BiFunctionDoc, Throwable, Doc DEFAULT_FAILURE_MAPPER { doc, e - doc.copyWith( status: failed , error: e.message ) } ListDoc handle(ListDoc changes, FunctionDoc, TryResource creator, PredicateDoc filter DEFAULT_FILTER, BiFunctionDoc, Resource, Doc successMapper DEFAULT_SUCCESS_MAPPER, BiFunctionDoc, Throwable, Doc failureMapper DEFAULT_FAILURE_MAPPER) { changes .findAll { filter } .collect { doc - creator.apply(doc) .map { resource - successMapper.apply(doc, resource) }.getOrElseGet { e - failureMapper.apply(doc, e) } } } } 介绍两者 您是否注意到以下部分 .collect { doc - creator.apply(doc) .map { resource - successMapper.apply(doc, resource) }.getOrElseGet { e - failureMapper.apply(doc, e) } } 请记住 creator的类型是 FunctionDoc, TryResource 表示它返回一个Try 。 我们在第7部分中介绍了Try 它是从Scala等语言中借来的。 幸运的是 collect { doc的“ doc”变量仍在传递给我们需要它的successMapper和failureMapper 范围内 但是Try#map的方法签名接受一个Function 与我们的successMapper 即一个BiFunction 。 Try#getOrElseGet也是Try#getOrElseGet 它也只需要一个Function 。 从Try Javadocs mapFunction super Textended U映射器 getOrElseGetFunction super Throwableextended T other 简而言之我们需要从 BiFunction 文档资源文档 successMapper BiFunction 文档Throwable文档 failureMapper 至 函数资源文档 successMapper 函数ThrowableDoc failureMapper 同时仍然可以将原始文档作为输入 。 让我们介绍两个简单的类型它们封装了2个BiFunction的2个参数 class CreationSuccess { Doc doc Resource resource } class CreationFailed { Doc doc Exception e } 我们将论点从 BiFunction 文档资源文档 successMapper BiFunction 文档Throwable文档 failureMapper 改为功能 函数CreationSuccessDoc successMapper 函数CreationFailedDoc failureMapper 现在 handle方法如下所示 ListDoc handle(ListDoc changes, FunctionDoc, TryResource creator, PredicateDoc filter, FunctionCreationSuccess, Doc successMapper, FunctionCreationFailed, Doc failureMapper) { changes .findAll { filter } .collect { doc - creator.apply(doc) .map(successMapper) .getOrElseGet(failureMapper) } } …… 但是还不行 。 Try使map和getOrElseGet需要分别。 一个 函数资源文档 successMapper 函数ThrowableDoc failureMapper 这就是为什么我们需要将其更改为另一个著名的FP结构称为Either 。 幸运的是Vavr有要么太。 它的Javadoc说 任一代表两种可能的值。 通常使用这两种类型来区分正确的值“正确”或错误的值。 它变得非常抽象 一个Either可以是Either.Left或Either.Right。 如果给定的Either是Right并投影到Left则Left操作对Right值没有影响。 如果给定的Either是Left并投影到Right则Right操作对Left值没有影响。 如果将“左”投影到“左”或将“右”投影到“右”则操作会生效。 让我解释以上神秘的文档。 如果我们更换 FunctionDoc, TryResource creator 通过 FunctionDoc, EitherCreationFailed, CreationSuccess creator 我们将CreationFailed分配给“ left”参数按照惯例通常会保留错误请参见Either上的Haskell文档 CreationSuccess是“ right”和“正确”值。 在运行时该实现曾经返回Try 但是现在可以返回Either.Right 如果成功例如 return Either.right( new CreationSuccess( doc: document, resource: [id: 7 ] ) ) 或Either.Left 但发生故障时除外- 两者都包括原始文档 。 是。 因为现在类型最终匹配所以我们终于压扁了 .collect { doc - creator.apply(doc) .map { resource - successMapper.apply(doc, resource) }.getOrElseGet { e - failureMapper.apply(doc, e) } } 进入 .collect { doc - creator.apply(doc) .map(successMapper) .getOrElseGet(failureMapper) } 现在 handle方法如下所示 ListDoc handle(ListDoc changes, FunctionDoc, EitherCreationFailed, CreationSuccess creator, PredicateDoc filter, FunctionCreationSuccess, Doc successMapper, FunctionCreationFailed, Doc failureMapper) { changes .findAll { filter } .collect { doc - creator.apply(doc) .map(successMapper) .getOrElseGet(failureMapper) } } 结论 我可以说我已经实现了开始时设定的大多数目标 是的我设法避免了重新分配变量 是的我设法避免了可变数据结构 是的我设法避免了状态 至少在FeedHandler中 是的我设法支持函数 使用某些Java内置函数类型和某些第三方库Vavr 我们已经将所有内容移至函数签名以便FeedHandler的handle方法的调用者可以直接传递正确的实现。 如果您从头到尾回顾原始版本您会注意到在处理更改列表时我们仍然承担所有责任 通过某些条件过滤文档列表 为每个文档创建资源 成功创建资源后执行一些操作 无法创建资源时执行其他操作 然而在第一部分中这些责任是势在必行写出来for语句声明都在一个大聚集在一起handle方法。 现在最后每个决定或动作都由具有抽象名称的函数表示例如“过滤器”“创建者”“ successMapper”和“ failureMapper”。 实际上它成为一个高阶函数以多个函数之一作为参数。 提供所有参数的责任已经转移到了客户的上层。 如果您查看GitHub项目您会注意到对于这些示例我不得不不断更新单元测试。 有争议的部分 在实践中如果不需要我可能不会编写我的Java业务代码例如FeedHandler类在传递通用Java函数类型即Function BiFunction Predicate Consumer Supplier 方面的使用方式所有这些极端的灵活性。 所有这些都是以可读性为代价的。 是的Java是一种静态类型的语言因此使用泛型时必须在所有类型参数中明确使用一种语言从而导致以下功能的签名困难 handle(ListDoc changes, FunctionDoc, EitherCreationFailed, CreationSuccess creator, PredicateDoc filter, FunctionCreationSuccess, Doc successMapper, FunctionCreationFailed, Doc failureMapper) 在普通JavaScript中您将没有任何类型并且您必须阅读文档以了解每个参数的期望。 handle function (changes, creator, filter, successMapper, failureMapper) 但是这是一个折衷方案。 Groovy中也是一个JVM语言 可以让我省略所有的例子类型的信息在这个系列中甚至允许我使用闭包象Java lambda表达式是在Groovy中的函数式编程范式的核心。 更极端的做法是在类级别指定所有类型以使客户端具有最大的灵活性以便为不同的FeedHandler实例指定不同的类型。 handle(ListT changes, FunctionT, EitherR, S creator, PredicateT filter, FunctionS, T successMapper, FunctionR, T failureMapper) 什么时候合适 如果您完全控制代码则在特定上下文中使用它来解决特定问题时这将过于抽象而无法产生任何收益。 但是如果我将一个库或框架开源或者在一个组织内向其他团队或部门使用该库或框架正在各种不同的用例中使用那么我可能不会事先想到为灵活性而设计可能值得。 让呼叫者决定如何过滤以及成功或失败的构成是明智之举。 最终上述内容在API设计 是和解耦方面都有所涉及但是在典型的Enterprise Java Java项目中“使一切成为函数”可能需要与您和您的团队成员进行一些讨论。 多年来一些同事已经习惯了一种更传统更惯用的代码编写方式。 好的零件 我绝对希望使用不可变的数据结构 和“参照透明性”来帮助推断我的数据所处的状态。想想Collections.unmodifiableCollection的集合。 在我的示例中我将Groovy的Immutable用于POJO但在普通的Java库例如Immutables AutoValue或Project Lombok中也可以使用。 最大的改进实际上是导致了一种更具功能性的样式使代码讲故事 这主要是关于分离关注点并适当地命名事物。 在任何编程风格即使是OOD中这都是一个好习惯但这确实消除了混乱并允许引入纯函数。 在Java中我们习惯于以特定方式进行异常处理以至于像我这样的开发人员很难提出其他解决方案。 诸如Haskell之类的功能语言仅返回错误代码因为“ Niklaus Wirth认为异常是GOTO的转世因此省略了它们” 。 在Java中可以使用CompletableFuture或… 通过引入第3方库例如Vavr可在您自己的代码库中使用的特定类型例如Try和Either 可以极大地帮助您启用以FP样式编写的更多选项 我以流畅的方式编写“成功”或“失败”路径并具有很高的可读性而感到非常着迷。 Java不是F的Scala或Haskell或Clojure它最初遵循的是面向对象编程OOP范例就像C CRuby等一样但是在Java 8中引入了lambda表达式并结合了一些很棒的功能之后如今开放源代码库如今开发人员绝对可以选择OOP和FP必须提供的最佳元素 。 做系列的经验教训 我在很早以前就开始了这个系列的讨论 。 早在2017年我发现自己在一段代码上进行了一些FP风格的重构这启发了我去寻找一系列名为“ Functional Java by Example”的文章的示例 。 这成为我在每个批次中一直使用的FeedHandler代码。 那时我已经对所有的代码进行了更改但是当我计划编写实际的博客文章时我常常想到“我只是不能展示重构我必须进行实际解释” 那就是我为自己设置陷阱的地方因为在整个过程中我坐下来写作的时间越来越少。 任何写过博客的人都知道简单地分享要点和撰写可理解的英语co的连贯段落在时间上的区别 下次当我想到进行一系列学习时我将向Google返回这些经验教训 如果您不准备在发布新文章时每次准备发布的每期文章都更新所有链接则不要在每篇文章的顶部都包含目录TOC。 如果将这些交叉发布到公司的公司博客中则工作量是原来的2倍 随着时间的流逝您可能会得出自己宁愿偏离主要用例的结论也就是刚开始使用的Big Coding Example。 我宁愿展示更多的FP概念例如 使用FP技术时的咖喱记忆懒惰以及不同的心态但我不能很好地适应以前完成的重构和我在一开始建立的TOC 。 如果您正在撰写有关特定概念的文章通常会找到一个合适的示例来帮助说明手头的特定概念并且仍然与读者相关。 随着时间的流逝我将获得更好的洞察力从而可以确定接下来要写的更好的东西以及要使用的更合适的示例。 下次我将不得不寻找一种方法来更好地允许给自己一些创作上的自由 《功能性思维语法惊人的范式 》尼尔·福特Neil Ford着它展示了FP思维的新方法并且也以不同的方式处理问题。 40分钟内的函数式编程 Russ Olsen的Youtube视频解释说“这些数学家用379页证明1 1 2。 让我们看看我们可以从中吸取什么好主意。” 为什么不对函数进行规范编程 理查德·费尔德曼Richard Feldman的Youtube视频他解释了为什么OOP变得非常流行以及FP为何不是常态。 正如您所知他是Elm核心团队的成员与FP有一定的联系。 耦合控制的倒置有关“托管功能”的深思熟虑的文章。 您想要抽象吗 如果您有任何意见或建议我很想听听他们的意见 编程愉快 翻译自: https://www.javacodegeeks.com/2019/12/functional-java-by-example-part-8-more-pure-functions.htmljava 函数式编程 示例
http://www.pierceye.com/news/158098/

相关文章:

  • 嘉兴做网站优化公司江阴网站优化公司
  • dz可以做旅游网站吗wordpress 4.1.1 漏洞
  • 谷歌网站地图生成福州便民网免费发布信息
  • 最新军事战争新闻超级优化大师
  • 好的网站建设公司排名网站建设 交易保障
  • 怎么查看网站外链效果代理注册公司有什么风险
  • 西安网站漏洞免费自动生成小程序
  • 怎么修改网站信息同ip网站做301
  • 松江品划网络做网站logo设计网页
  • 重庆博达建设集团股份有限公司网站徐州建设企业网站
  • 有没有专门做老年婚介的网站东营会计信息网官网
  • 鞍山怎么做平台软件汕头网站时优化
  • 邹城建网站深圳装修公司排行榜
  • 泊头网站优化WordPress如何添加cnzz
  • dz论坛网站创建页面wap网站建设方案 pdf
  • 网站建设项目报告总结报告seo关于网站搜索排名关键词的标准评定
  • 东莞电商网站建设wordpress注册验证邮箱
  • 网站建设名中国建设劳动学会是假网站吗
  • 一个优秀的个人网站百度极速版免费下载安装
  • 咋做211校徽加网站wordpress免费教程视频教程
  • 网站建设制作网络营销公司蛋糕店网站模板
  • a站网址东莞市网络seo推广价格
  • 莱州市双语网站seo白帽优化
  • 不忘初心网站建设深圳公租房官网
  • 网站点击率原因深圳做自适应网站制作
  • 上海个人建站小程序注册完成后如何制作
  • 微网站开发平台 开源大庆做网站公司
  • 长沙市住房和城乡建设局网站wordpress付费可见插件
  • 建设个人网站的参考网站及文献辽宁建设工程造价管理网站
  • 如何做360网站的排名新品发布会策划方案ppt