网站建设技术人员工作总结,外贸婚纱礼服网站,营销推广公司,建设网站能解决什么问题使用Java8的Lambda实现MonadMonad是函数语言(Cojure或Scala)中的设计模式概念#xff0c; 那么现在为什么在Java中变得如此重要#xff1f;因为Java从版本8以后引入了新的Lambda特性#xff0c;Lambda或闭包是函数语言的特征#xff0c;它允许你使用代码块作为一个变量 那么现在为什么在Java中变得如此重要因为Java从版本8以后引入了新的Lambda特性Lambda或闭包是函数语言的特征它允许你使用代码块作为一个变量并且让你将它传递。首先我们假设一个不使用Monad的场景空值Null检查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访问其street接到名称有可能是空的不用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类代表一个可选值然后有一个围绕其运行lambda的map方法该方法返回另外一个可选值。如果围绕的值是一个null, 它会返回一个Option其中包含null, 这样避免空指针出现注意map方法需要使用一个lambda作为参数但是我们需要首先创建一个接口SingleArgExpression 支持它。因为在Java8中使用函数接口表达lambda:public interface SingleArgExpression {public R function(P param);}准备好了函数接口这样我们可以将SingleArgExpression的lambda作为参数传递了下面是Option.java关键是其中的map方法该方法参数是SingleArgExpression的lambda。public class Option {T value;public Option(T value){this.value value;}//核心重要方法map 如果是空就不应用lambda否则就可以使用lambdapublic Option map(SingleArgExpression mapper){if(value null){return new Option(null);}else{return new Option(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;}}下面我们重新编写Userdetails如下public class OptionExample{public static class Userdetails{public Option address new Option(null);public Option name new Option(null);}public static class Name{public Option firstName new Option(null);public Option lastName new Option(null);}public static class Address{public Option houseNumber;public Option street;public Option city;}public static class Street{public Option name;}public static class City{public Option name;}public static void main(String [] args){Option userOpt new Option(new Userdetails());//现在变得很简单了。String streetName userOpt.flatMap(user - user.address).map(address - address.street).map(street - street.name).get();System.out.println(streetName);}}核心代码如下String streetName userOpt.flatMap(user - user.address).map(address - address.street).map(street - street.name).get();这样就不用担心返回空值抛出空指针错误了。现在UserDetails的所有方法都是返回一个Option了这确保方法的使用者了解返回值可能会为空。为了避免核心代码中每次都调用get(), 我们使用类似flatMap替代mappublic Option flatMap(SingleArgExpression mapper){if(value null){return new Option(null);}return mapper.function(value);}上面方法其实是一个过滤器它让我们放入一个if条件在map链中, 这样只有当条件为真是获得一个值注意这也是空安全null-safe。