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

承德网站建设报价小程序微盟

承德网站建设报价,小程序微盟,网站建设多少钱十年乐云seo,wordpress会员投稿在函数式编程中#xff0c;Map和Fold是两个非常有用的运算符#xff0c;它们属于每种函数式语言。 如果Map和Fold运算符是如此强大且必不可少#xff0c;那么您如何解释说即使Java编程语言缺少这两个运算符#xff0c;我们也可以使用Java来完成工作#xff1f; 事实是Map和Fold是两个非常有用的运算符它们属于每种函数式语言。 如果Map和Fold运算符是如此强大且必不可少那么您如何解释说即使Java编程语言缺少这两个运算符我们也可以使用Java来完成工作 事实是使用Java进行编码时您已经进行了Map和Fold只是每次都使用循环手动进行操作。 免责声明我不是函数式编程的参考本文不过是一个简短的介绍 FP爱好者可能不太喜欢它。 您已经熟悉了 想象一下不含增值税的数量的List Double。 我们希望将此列表转换为包含增值税的另一个相应列表。 首先我们定义一种将增值税加到一个单一金额中的方法 public double addVAT(double amount, double rate) {return amount * (1 rate);} 现在让我们将此方法应用于列表中的每个金额 public ListDouble addVAT(ListDouble amounts, double rate){final ListDouble amountsWithVAT new ArrayListDouble();for(double amount : amounts){amountsWithVAT.add(addVAT(amount, rate));}return amountsWithVAT; } 在这里我们创建了另一个输出列表对于输入列表的每个元素我们对其应用了addVAT方法然后将结果存储到大小完全相同的输出列表中。 恭喜正如我们刚刚手工完成的在方法addVAT的输入列表上有一个Map。 让我们再做一次。 现在我们要使用货币汇率将每个金额转换为另一种货币因此我们需要一种新的方法 公共double convertCurrencydouble public double convertCurrency(double amount, double currencyRate){return amount / currencyRate;} 现在我们可以将此方法应用于列表中的每个元素 public ListDouble convertCurrency(ListDouble amounts, double currencyRate){final ListDouble amountsInCurrency new ArrayListDouble();for(double amount : amounts){amountsInCurrency.add(convertCurrency(amount, currencyRate));}return amountsInCurrency; } 注意除了在步骤2处调用的方法外两种接受列表的方法是如何相似的 创建一个输出列表 为输入列表中的每个元素调用给定方法 并将结果存储到输出列表中 返回输出列表。 您经常在Java中执行此操作而这恰恰是Map运算符将给定方法someMethod TT应用于list T的每个元素这将为您提供另一个相同大小的list T。 功能语言认识到这种特殊需求在集合的每个元素上应用一种方法非常普遍因此他们将其直接封装到内置的Map运算符中。 这样给定addVATdoubledouble方法我们可以使用Map运算符直接编写如下代码 List amountsWithVAT map (addVAT, amounts, rate) 是的第一个参数是一个函数因为函数是函数语言中的一等公民因此可以将它们作为参数传递。 与for循环相比使用Map运算符更简洁更不易出错其意图也更加明确但是我们在Java中没有它…… 因此这些示例的要点是您已经不熟悉甚至不知道函数式编程的关键概念Map运算符。 现在是Fold运算符 回到金额列表现在我们需要将总金额计算为每个金额的总和。 超级容易让我们循环执行一下 public double totalAmount(ListDouble amounts){double sum 0;for(double amount : amounts){sum amount;}return sum; } 基本上我们只是在列表上进行了折叠使用函数“ ”将每个元素折叠成一个元素这里是一个递增的数字一次折叠一个。 这类似于Map运算符除了结果不是列表而是单个元素标量。 这又是您通常用Java编写的那种代码现在您已经用功能语言为其命名“ Fold ”或“ Reduce”。 Fold运算符通常在函数式语言中是递归的因此我们在此不再对其进行描述。 但是我们可以使用某种可变状态在迭代之间累加结果从而以迭代形式实现相同的目的。 在这种方法中Fold采用一种内部可变状态的方法该方法期望一个元素例如someMethodT并将其反复应用于输入列表T中的每个元素直到我们得到一个单个元素T即折叠操作的结果。 与Fold一起使用的典型函数是求和逻辑与和或List.add或List.addAllStringBuilder.appendmax或min等。Fold的思维方式类似于SQL中的聚合函数 。 形状思考 直观地思考带有草率的图片Map接收一个大小为n的列表并返回另一个大小相同的列表 另一方面Fold获取大小为n的列表并返回单个元素标量 您可能还记得我以前关于谓词的文章 这些文章通常用于将集合过滤为元素较少的集合。 实际上此过滤器运算符是在大多数功能语言中补充Map和Fold的第三种标准运算符。 Eclipse模板 由于Map和Fold很常见因此有必要为它们创建Eclipse模板例如Map 在Java中更接近地图和折叠 Map和Fold是期望函数作为参数的构造而在Java中传递方法的唯一方法是将其包装到接口中。 在Apache Commons Collections中有两个接口对于我们的需求特别有趣 Transformer 具有一个方法transformTT 和Closure 具有一个方法executeTvoid 。 类CollectionUtils提供了collectIteratorTransformer方法它基本上是Java集合的穷人Map运算符以及forAllDo方法该方法可以使用闭包来模拟Fold运算符。 使用Google Guava Iterables类提供了静态方法transformIterableFunction 该方法基本上是Map运算符。 ListDouble exVat Arrays.asList(new Double[] { 99., 127., 35. });IterableDouble incVat Iterables.transform(exVat, new FunctionDouble, Double() {public Double apply(Double exVat) {return exVat * (1.196);}});System.out.println(incVat); //print [118.404, 151.892, 41.86] 类似的变换方法也可在类解释为解释和地图为地图。 要在Java中模拟Fold运算符可以使用Closure接口例如Apache Commons Collection中的Closure接口仅使用一个带有一个参数的单一方法因此您必须在内部保留当前的-mutable-状态就像 确实。 不幸的是尽管Guava中没有Fold尽管它经常被要求提供 甚至没有类似闭包的函数但是创建自己的函数并不难例如您可以使用以下方法实现上述总计 // the closure interface with same input/output type public interface ClosureT {T execute(T value); }// an example of a concrete closure public class SummingClosure implements ClosureDouble {private double sum 0;public Double execute(Double amount) {sum amount; // apply operatorreturn sum; // return current accumulated value} }// the poor man Fold operator public final static T T foreach(IterableT list, ClosureT closure) {T result null;for (T t : list) {result closure.execute(t);}return result; }Test // example of use public void testFold() throws Exception {SummingClosure closure new SummingClosure();ListDouble exVat Arrays.asList(new Double[] { 99., 127., 35. });Double result foreach(exVat, closure);System.out.println(result); // print 261.0 } 不仅用于收藏可折叠在树木和其他建筑物上 Map and Fold的功能不仅限于简单的集合还可以扩展到任何可导航的结构尤其是树和图。 想象一棵使用节点类及其子节点的树。 将深度优先搜索和广度优先搜索DFS和BFS编码为两个接受Closure作为单个参数的通用方法可能是一个好主意 public class Node ...{...public void dfs(Closure closure){...}public void bfs(Closure closure){...} } 我过去经常使用这种技术我可以说它可以大大减少类的大小仅使用一种通用方法而不是许多看起来相似的方法每个方法都会重做自己的树遍历。 更重要的是可以使用模拟闭包对遍历本身进行单元测试。 每个封盖也可以独立进行单元测试所有这些都使您的生活变得更加简单。 访客模式可以实现非常相似的想法您可能已经很熟悉。 我在我的代码和其他几个团队的代码中多次看到Visitor非常适合在遍历数据结构期间累积状态。 在这种情况下Visitor只是闭合中传递给折叠的一种特殊情况。 Map-Reduce上的一个字 您可能听说过Map-Reduce模式是的其中的“ Map”和“ Reduce”一词指的是我们刚刚看到的相同的函数运算符Map和Fold也称为Reduce。 即使实际应用更加复杂也很容易注意到Map 令人尴尬地是并行的这对并行计算有很大帮助。 参考 与我们的JCG合作伙伴一起 在您的日常Java中使用Map和Fold进行函数式编程的思考   Cyrille Martraire 博客上的Cyrille Martraire 。 翻译自: https://www.javacodegeeks.com/2012/03/functional-programming-with-map-and.html
http://wiki.neutronadmin.com/news/25932/

相关文章:

  • 优美网站源码前端做网站都要做哪些
  • 深圳线运营是网站建设推网怎么制作
  • 常州个人做网站河南工程学院网站建设
  • 网站不想被百度抓取asp网站开发 pdf
  • 唐山乾正建设工程材料检测公司网站哈尔滨网站建设费用
  • 中文域名.网站泉州手机端建站模板
  • 如何找到做网站的客户浙江网站备案流程
  • html后缀的网站运动健身类网站开发
  • 上海网站建设的价格是多少钱青海小学网站建设
  • vue 做电商网站宁波网页设计找哪家
  • 大连seo推广优化seo推广是什么
  • 最大的搜索网站排名软件如何制作
  • 自媒体时代做网站有前途吗做视频网站
  • 诸暨制作网站的公司有哪些你不会百度吗网页生成
  • 做网站配置好了找不到服务器技术支持 东莞网站建设电脑回收
  • 免费网站源码下载平台wordpress里的发消息给我
  • 佛山企业如何建网站公司网站首页布局图
  • 怎么做培训班网站网站开发实战
  • dede做招聘网站深圳我的网站
  • 网站设计的内容python wordpress建站
  • 模版网站建设企业百度seo优化网站
  • 手机微网站第二年续费吗旅游找什么网站好
  • 建设搜索引擎网站江苏省建是国企吗
  • 网站建设团队分工贵安新区网站建设推广
  • 做网站域名要自己注册吗个体工商网站备案
  • 河南艾特网站建设公司石家庄局域网网站建设
  • 网站建设是指如何更换网站的logo
  • 石家庄手机建网站做剧情游戏的网站
  • 怎么做网站策划的模板聊天软件
  • 临沂网站建设报价新余网站建设公司