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

专注做蔬菜的网站网站qq一键登录

专注做蔬菜的网站,网站qq一键登录,手工制作大全废物利用,合肥论坛建站模板什么是monad #xff1f;#xff1a; monad是一种设计模式概念#xff0c;用于大多数功能编程语言#xff08;如Lisp#xff09;或现代世界的Clojure或Scala中。 #xff08;实际上#xff0c;我会从scala复制一些内容。#xff09;现在#xff0c;为什么它在Java中变… 什么是monad monad是一种设计模式概念用于大多数功能编程语言如Lisp或现代世界的Clojure或Scala中。 实际上我会从scala复制一些内容。现在为什么它在Java中变得很重要 因为java从版本8获得了新的lambda功能。Lambda或闭包是一种功能编程功能。 它使您可以将代码块用作变量并像这样传递代码块。 我在上一篇文章Java 8中的烹饪-项目Lambda中讨论了Java的“项目Lambda”。 现在您可以在此处提供的JDK 8预览版中进行尝试。 现在我们可以在Java 8之前做monad吗 当然毕竟Java的lambda在语义上只是实现接口的另一种方式实际上并不是因为编译器知道它的使用位置而是太多混乱的代码几乎可以杀死其实用程序。 现在让我在Java中建立一个用例就像没有monad一样而不是向您描述一个抽象的看似毫无意义的想法。 讨厌的null检查如果您编写了任何非平凡的例如Hello-Worldjava程序则可能已经做了一些null检查。 它们就像编程必不可少的弊端您不能没有它们但是它们会使您的程序杂乱无章。 让我们以带有一组Java数据对象的以下示例为例。 注意无论如何我都没有使用过反模式的getter或setter。 public static class Userdetails{public Address address;public Name name;}public static class Name{public String firstName;public String lastName; }public static class Address{public String houseNumber;public Street street;public City city;}public static class Street{public String name; }public static class City{public String name; } 现在说您想从UserDetails用户访问街道名称并且任何属性都可能为null。 没有monad您可能会编写如下代码。 if(user null )return null; else if(user.address null)return null; else if(user.address.street null)return null; elsereturn user.address.street.name; 理想情况下它应该是单线的。 我们真正关心的代码周围杂乱无章。 现在让我们看看如何解决这个问题。 让我们创建一个代表可选值的Option类。 然后让我们有一个map方法该方法将在其包装后的值上运行lambda并返回另一个选项。 如果包装的值为null则它将返回一个包含null的Option而不处理lambda从而避免使用null指针异常。 请注意map方法实际上需要使用lambda作为参数但是我们将需要创建一个接口SingleArgExpression来支持该方法。 SingleArgExpression.java package com.geekyarticles.lambda;public interface SingleArgExpressionP, R {public R function(P param); } Option.java package com.geekyarticles.javamonads;import com.geekyarticles.lambda.public class OptionT {T value;public Option(T value){this.value value;}public E OptionE map(SingleArgExpressionT,E mapper){if(value null){return new OptionE(null);}else{return new OptionE(mapper.function(value));}} Overridepublic boolean equals(Object rhs){if(rhs instanceof Option){Option o (Option)rhs;if(value null) return (o.valuenull);else{return value.equals(o.value);}}else{return false;}}Overridepublic int hashCode(){return valuenull? 0 : value.hashCode();}public T get(){return value;}} OptionExample.java package com.geekyarticles.javamonads.examples;import com.geekyarticles.javamonads.public class OptionExample{public static class Userdetails{public OptionAddress address new Option(null);public OptionName name new Option(null);}public static class Name{public OptionString firstName new OptionString(null);public OptionString lastName new OptionString(null); }public static class Address{public OptionString houseNumber;public OptionStreet street;public OptionCity city;}public static class Street{public OptionString name; }public static class City{public OptionString name; }public static void main(String [] args){OptionUserdetails userOpt new Option(new Userdetails());//And look how simple it is nowString streetName userOpt.flatMap(user - user.address).map(address - address.street).map(street - street.name).get();System.out.println(streetName);}} 所以现在基本上的想法是只要方法有机会返回null就返回Option。 将确保该方法的使用者理解该值可以为null并且还使该使用者隐式地通过null检查如图所示。 现在我们从所有可能必须返回null的方法中返回Option那么映射内的表达式也可能会将Option用作返回类型。 为了避免每次都调用get我们可以有一个与map类似的方法flatMap除了它接受一个Option作为传递给它的lambda的返回类型。 public E OptionE flatMap(SingleArgExpressionT, OptionE mapper){if(value null){return new OptionE(null);}return mapper.function(value);} 我要说的最后一种方法是过滤器。 它将使我们在映射链中放置一个if条件以便仅当条件为true时才获得一个值。 请注意这也是null安全的。 在此特定的monad中filter的用法并不明显但稍后我们将看到其用法。 以下是一个示例其中所有可为空的字段都已升级为Option因此将flatMap用于地图的读取。 Option.java package com.geekyarticles.javamonads;import com.geekyarticles.lambda.public class OptionT {T value;public Option(T value){this.value value;}public E OptionE map(SingleArgExpressionT,E mapper){if(value null){return new OptionE(null);}else{return new OptionE(mapper.function(value));}}public E OptionE flatMap(SingleArgExpressionT, OptionE mapper){if(value null){return new OptionE(null);}return mapper.function(value);}public OptionT filter(SingleArgExpressionT, Boolean filter){if(value null){return new OptionT(null);}else if(filter.function(value)){return this;}else{return new OptionT(null);}}Overridepublic boolean equals(Object rhs){if(rhs instanceof Option){Option o (Option)rhs;if(value null) return (o.valuenull);else{return value.equals(o.value);}}else{return false;}}Overridepublic int hashCode(){return valuenull? 0 : value.hashCode();}public T get(){return value;}} OptionExample.java package com.geekyarticles.javamonads.examples;import com.geekyarticles.javamonads.public class OptionExample{public static class Userdetails{public OptionAddress address new Option(null);public OptionName name new Option(null);}public static class Name{public OptionString firstName new OptionString(null);public OptionString lastName new OptionString(null); }public static class Address{public OptionString houseNumber;public OptionStreet street;public OptionCity city;}public static class Street{public OptionString name; }public static class City{public OptionString name; }public static void main(String [] args){//This part is just the setup code for the example to workOptionUserdetails userOpt new Option(new Userdetails());userOpt.get().address new Option(new Address());userOpt.get().address.get().streetnew Option(new Street());userOpt.get().address.get().street.get().name new Option(H. Street);//And look how simple it is nowString streetName userOpt.flatMap(user - user.address).flatMap(address - address.street).flatMap(street - street.name).get();System.out.println(streetName);}} 集合和Monad Monad对集合框架也很有用。 尽管最好的方法是让每个收集类自己成为最佳性能的单子将来可能会成为单子但目前我们可以将它们包装起来。 这也带来了必须破坏类型检查系统的问题因为我们事先不知道构建器的通用返回类型。 NoArgExpression.java package com.geekyarticles.lambda;public interface NoArgExpressionR {public R function(); } SingleArgExpression.java package com.geekyarticles.lambda;public interface SingleArgExpressionP, R {public R function(P param); } CollectionMonad.java package com.geekyarticles.javamonads;import com.geekyarticles.lambda. import java.util.Collection; import java.util.ArrayList; import java.util.Arrays;public class CollectionMonadT {CollectionT value;NoArgExpressionCollection builder;public CollectionMonad(CollectionT value, NoArgExpressionCollection builder){this.value value;this.builder builder;}public CollectionMonad(T[] elements){this.value new ArrayListT(elements.length);this.value.addAll(Arrays.asList(elements));this.builder () - new ArrayList();}SuppressWarnings(unchecked)public E CollectionMonadE map(SingleArgExpressionT,E mapper){CollectionE result (CollectionE)builder.function(); for(T item:value){result.add(mapper.function(item));} return new CollectionMonadE(result, builder); }//What flatMap does is to flatten out the CollectionMonad returned by the lambda that is provided//It really shrinks a nested loop.SuppressWarnings(unchecked)public E CollectionMonadE flatMap(SingleArgExpressionT, CollectionMonadE mapper){CollectionE result (CollectionE)builder.function(); for(T item:value){CollectionMonadE forItem mapper.function(item);for(E e : forItem.get()){result.add(e);}}return new CollectionMonadE(result, builder);}SuppressWarnings(unchecked)public CollectionMonadT filter(SingleArgExpressionT, Boolean filter){CollectionT result (CollectionT)builder.function(); for(T item:value){if(filter.function(item)){result.add(item);}} return new CollectionMonadT(result, builder); }public CollectionT get(){return value;}Overridepublic String toString(){ return value.toString();}} ListMonadTest.java package com.geekyarticles.javamonads.examples;import com.geekyarticles.javamonads. import java.util.public class ListMonadTest {public static void main(String [] args){mapExample();flatMapExample();filterExample();}public static void mapExample(){ListInteger list new ArrayList();list.add(10);list.add(1);list.add(210);list.add(130);list.add(2);CollectionMonadInteger c new CollectionMonad(list, () - new ArrayList());//Use of mapSystem.out.println(c.map(v - v.toString()).map(v - v.charAt(0)));System.out.println();}public static void flatMapExample(){ListInteger list new ArrayList();list.add(10);list.add(1);list.add(210);list.add(130);list.add(2);CollectionMonadInteger c new CollectionMonad(list, () - new ArrayList());//Use of flatMapSystem.out.println(c.flatMap(v - new CollectionMonadInteger(Collections.nCopies(v,v), () - new ArrayList())));System.out.println();}public static void filterExample(){ListInteger list new ArrayList();list.add(10);list.add(1);list.add(210);list.add(130);list.add(2);CollectionMonadInteger c new CollectionMonad(list, () - new ArrayList());//Use of flatMap and filterSystem.out.println(c.flatMap(v - new CollectionMonadInteger(Collections.nCopies(v,v), () - new ArrayList())).filter(v - v100));System.out.println();}} 乍一看在这里使用flatmap似乎很麻烦因为我们需要从lambda创建一个CollectionMonad。 但是如果考虑使用嵌套的for循环的等效代码它仍然非常简洁。 Streams和Monads在这一点上您可能正在考虑InputStream但我们将讨论比这更笼统的内容。 流基本上是可能是无限的序列。 例如可以使用公式或实际上是InputStream来创建它。 就像Iterator一样我们将具有具有hasNext和next方法的流。 实际上我们将使用Iterator接口以便可以使用增强的for循环。 但是我们还将使流变为单声道。 这种情况特别有趣因为流可能是无限的因此映射必须返回延迟处理lambda的流。 在我们的示例中我们将创建具有特定分布的专用随机数生成器。 通常所有值都是同等概率的。 但是我们可以通过映射来改变它。 让我们看一下示例以更好地理解。 让我们创建一个可以包装任意Iterator的通用Stream。 这样我们也可以使用它现有的收集框架。 Stream.java package com.geekyarticles.javamonads;import java.util.Iterator; import com.geekyarticles.lambda. import java.util.NoSuchElementException;public class StreamT implements IterableOptionT, IteratorOptionT{//Provides a map on the underlying streamprivate class MapperStreamT,R extends StreamR{private StreamT input;private SingleArgExpressionT, R mapper;public MapperStream(StreamT input, SingleArgExpressionT, R mapper){this.input input;this.mapper mapper;}Overridepublic OptionR next(){if(!hasNext()){//This is to conform to Iterator documentationthrow new NoSuchElementException();}return input.next().map(mapper);}Overridepublic boolean hasNext(){return input.hasNext();}}//Provides a flatMap on the underlying streamprivate class FlatMapperStreamT,R extends StreamR{private StreamT input;private SingleArgExpressionT, StreamR mapper;private OptionStreamR currentStream new Option(null);public FlatMapperStream(StreamT input, SingleArgExpressionT, StreamR mapper){this.input input;this.mapper mapper;}Overridepublic OptionR next(){if(hasNext()){return currentStream.flatMap(stream - stream.next());}else{//This is to conform to Iterator documentationthrow new NoSuchElementException();}}Overridepublic boolean hasNext(){if(currentStream.map(s - s.hasNext()) //Now Option(false) and Option(null) should be treated same.equals(new OptionBoolean(Boolean.TRUE))){return true;}else if(input.hasNext()){currentStreaminput.next().map(mapper);return hasNext();}else{return false;}}}//Puts a filter on the underlying streamprivate class FilterStreamT extends StreamT{private StreamT input;private SingleArgExpressionT, Boolean filter;private OptionT next new Option(null);public FilterStream(StreamT input, SingleArgExpressionT, Boolean filter){this.input input;this.filter filter;updateNext();}public boolean hasNext(){return next ! null; }//We always keep one element calculated in advance.private void updateNext(){next input.hasNext()? input.next(): new OptionT(null);if(!next.map(filter).equals(new OptionBoolean(Boolean.TRUE))){if(input.hasNext()){updateNext(); }else{next null; }}}public OptionT next(){OptionT res next;updateNext(); if(res null){throw new NoSuchElementException();} return res;}}protected IteratorT input;public Stream(IteratorT input){this.inputinput;}//Dummy constructor for the use of subclassesprotected Stream(){}Overridepublic boolean hasNext(){return input.hasNext();}Overridepublic OptionT next(){return new Option(input.next());}Overridepublic void remove(){throw new UnsupportedOperationException();}public R StreamR map(SingleArgExpressionT,R mapper){return new MapperStreamT, R(this, mapper);}public R StreamR flatMap(SingleArgExpressionT, StreamR mapper){return new FlatMapperStreamT, R(this, mapper);}public StreamT filter(SingleArgExpressionT, Boolean filter){ return new FilterStreamT(this, filter);}public IteratorOptionT iterator(){return this;}} StreamExample.java package com.geekyarticles.javamonads.examples;import com.geekyarticles.javamonads. import java.util.public class StreamExample{public static void main(String [] args){iteratorExample();infiniteExample();}static void iteratorExample(){System.out.println(iteratorExample);ListInteger l new ArrayList();l.addAll(Arrays.asList(new Integer[]{1,2,5,20,4,51,7,30,4,5,2,2,1,30,9,2,1,3}));StreamInteger stream new Stream(l.iterator());//Stacking up operations//Multiply each element by 10 and only select if less than 70//Then take the remainder after dividing by 13for(OptionInteger i : stream.map(i - i*10).filter(i - i 70).map(i - i%13)){System.out.println(i.get());}System.out.println();}static void infiniteExample(){System.out.println(infiniteExample);IteratorDouble randomGenerator new IteratorDouble(){Overridepublic Double next(){return Math.random();}Overridepublic boolean hasNext(){//Infinite iteratorreturn true;}public void remove(){throw new UnsupportedOperationException();}};StreamDouble randomStream new Stream(randomGenerator);//Now generate a 2 digit integer every second, for ever.for(OptionInteger val:randomStream.map(v - (int)(v*100))){System.out.println(val.get());try{Thread.sleep(1000);}catch(InterruptedException ex){ex.printStackTrace();}}}} 这个例子很复杂所以花一些时间阅读一下。 但是Stream类仅需要创建一次。 一旦到达它就可以包装任何Iterator它将为您免费提供所有monadic功能。 在我的下一篇文章中我将解释更多单子。 参考 Java 8 Lambda表达式的函数式编程-来自GCG 伙伴 Jbas 合作伙伴 Debasish Ray Chawdhuri的Monad来自Geeky Articles博客。 翻译自: https://www.javacodegeeks.com/2014/03/functional-programming-with-java-8-lambda-expressions-monads.html
http://www.lebaoying.cn/news/36118.html

相关文章:

  • 别人做网站要把什么要过来做写字楼的网站有哪些资料
  • 潍坊最早做网站的公司做变性手术视频网站
  • 网站开发攻克时间竞价推广网站建设
  • 阜宁做网站的价格网站分析表
  • 厦门网站建设114北京市门户网站
  • 做网站怎么让百度收录了wordpress怎么填写横幅图片
  • 怎么攻击网站吗成都专业网站制作建设
  • 厦门建设网站公司公司增加英文网站要怎么做
  • 网站建设是干什么网站建设注册小程序
  • 网络推广有哪几种方法关键词优化seo外包
  • 营口沿海开发建设有限公司网站云南人参果
  • 开个捕鱼网站怎么做wordpress要求配置
  • 网站建设功能规划本网站正在建设图片
  • 辽宁鹤城建设集团网站做软件页面设计的软件
  • 长沙哪里可以做网站上海网址大全
  • 建设企业网站需要什么SEO如何建设网站
  • 深圳网站建设价格品牌营销方案模板
  • 网站推广的要点建设优化一个网站步骤
  • 四川住房和城乡建设厅网站打不开中国未来楼市走势分析
  • 东莞市网站seo小米路由器mini做网站
  • wordpress提交表单插件电脑优化软件哪个好用
  • 织梦可以做导航网站用钢铁侠做网站
  • 网络营销网站建设论文芜湖县建设局网站
  • 通江县住房和城乡建设局网站南昌网站建设风格
  • 淘宝客网站怎么做的人少了最好的seo外包
  • 博客 选择 WordPressseo网络优化教程
  • 惠州网站建设惠州嘉兴网站建设嘉兴
  • 漯河网站建设 千弘网络唯品会一家做特卖的网站 分析
  • 网站 筛选功能wordpress jiathis
  • 个人网站快速备案企业家居网站建设