java lambda if_使用Java8的Lambda实现Monda -解道Jdon

使用Java8的Lambda实现Monad

Monad是函数语言(Cojure或Scala)中的设计模式概念, 那么现在为什么在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;

else

return 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,否则就可以使用lambda

public Option map(SingleArgExpression mapper){

if(value == null){

return new Option(null);

}else{

return new Option(mapper.function(value));

}

}

@Override

public boolean equals(Object rhs){

if(rhs instanceof Option){

Option o = (Option)rhs;

if(value == null)

return (o.value==null);

else{

return value.equals(o.value);

}

}else{

return false;

}

}

@Override

public int hashCode(){

return value==null? 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替代map:

public Option flatMap(SingleArgExpression> mapper){

if(value == null){

return new Option(null);

}

return  mapper.function(value);

}

上面方法其实是一个过滤器,它让我们放入一个if条件在map链中, 这样只有当条件为真是获得一个值,注意这也是空安全null-safe。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409602.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ConcurrentHashMap,一个更快的HashMap

ConcurrentHashMap 是 Doug Lea 的 util.concurrent 包的一部分&#xff0c;它提供比 Hashtable 或者 synchronizedMap 更高程度的并发性。而且&#xff0c;对于大多数成功的 get() 操作它会设法避免完全锁定&#xff0c;其结果就是使得并发应用程序有着非常好的吞吐量。这个月…

python算法与程序设计基础(第二版)第八章实训答案_Python算法与程序设计基础(第2版)...

章程序设计与计算思维1.1程序设计与计算机语言1.1.1程序设计1.1.2设计步骤1.1.3程序设计分类1.1.4基本规范1.1.5计算机语言1.2计算机语言与计算思维的关系1.2.1思维与计算思维1.2.2计算思维与计算科学的关系1.2.3计算思维与程序设计语言的关系1.3初识Python语言1.3.1Python语言…

python处理图片隐写分析_Python3简单实现隐写术

下载W3Cschool手机App&#xff0c;0基础随时随地学编程>>戳此了解导语利用Python简单实现图片隐写术。。。或者说是水印技术。。。说实话&#xff0c;真的只是简单实现。。。没什么技术含量。。。可以说是入门级的隐写术/水印技术。。。Lets Go?相关文件密码: 9ffy开发工…

使用Jquery提交Json格式的数据到Asp.net程序的另类做法

一般我们使用Jquery提交数据到Asp.net程序都有两种方法,今天我再介绍一种方法.以下是详细描述: 1)使用Get请求的方式,将参数接在请求Url的后面.例如: http://www.google.com.hk/search?qjquerypost 获取参数的方法:在Asp.net中可以使用Request.QueryString["q"]来获…

python xml添加命名空间_XML的命名空间与python解析方法

在 XML 中&#xff0c;元素名称是由开发者定义的&#xff0c;当两个不同的文档使用相同的元素名时&#xff0c;就会发生命名冲突&#xff0c;而XML 命名空间提供避免元素命名冲突的方法。XML 命名空间属性被放置于元素的开始标签之中&#xff0c;并使用以下的语法&#xff1a;x…

详解在Visual Studio中使用git版本系统(转)

http://www.uml.org.cn/pzgl/201206211.asp 转载于:https://www.cnblogs.com/kevin3274/archive/2012/08/29/2662556.html

java派生类_我可以使派生类从Java的基类继承派生成员...

我有看起来像这样的代码&#xff1a;public class A{public void doStuff(){System.out.print("Stuff successfully done");}}public class B extends A{public void doStuff(){System.out.print("Stuff successfully done, but in a different way");}pub…

流程图中的虚线含义_还在为画流程图烦恼,焦躁?介绍一款画图神器,让你爱上画图!...

在团队协作过程中最常见的就是开会、开会最常用的就是图&#xff0c;而图中最常见的就是流程图&#xff0c;时序图&#xff0c;类图等下面介绍一款画图神器&#xff1a;PlantUMLPlantUML是一个开源项目&#xff0c;支持快速绘制&#xff1a;时序图用例图类图活动图组件图状态图…

有限状态自动机java实现_用java开发编译器之:Thompson构造,将正则表达式转换为有限状态自动机...

阅读博客的朋友可以到我的网易云课堂中&#xff0c;通过视频的方式查看代码的调试和执行过程&#xff1a;上一节&#xff0c;我们通过代码&#xff0c;实现了一个有限状态自动机&#xff0c;并将其应用于对整形和浮点数的识别。构造有限状态自动机&#xff0c;并驱动它&#xf…

Zend Server搭建网站备注

1、Zend Server的使用 Zend Server自带php和apache,所以装zendserver的话不需要再安装其他任何东西。&#xff08;mysql默认没有安装&#xff0c;可以自行设置&#xff09; 2、工作路径配置&#xff1a; 在Zend\Apache2\conf\httpd.conf中添加 Alias/test "F:/workbench/t…

python的符号函数得到的数字类型_Python笔记——数字类型的几个函数

标准类型内建函数&#xff1a;cmp(obj1, obj2) 比较obj1和obj2&#xff0c;根据比较结果返回整型i:i < 0 if obj1 < obj2i > 0 if obj1 > obj2i 0 if obj1 obj2repr(obj)或obj 返回一个对象的字符串表示str(obj) 返回对象适合可读性好的字符串表示type(obj) 得到…

将SqlServer的数据导出到Excel/csv中的各种方法 .

以下都只是介绍操作的原理&#xff0c;具体要求要在应用中具体分析改变。 如果大家有其他好的方法&#xff0c;请相互告知&#xff0c;共同学习。 1. 此方法常用在form或者Console Application中&#xff0c;使用时须用要添加Reference&#xff0c;具体做法&#xff1a; …

java单例模式的实现方法_JAVA单例模式的几种实现方法

1 饿汉式单例类.在类初始化时&#xff0c;已经自行实例化class EagerSingleton {private static final EagerSingleton m_instance new EagerSingleton();/** * 私有的默认构造子 */private EagerSingleton() {}/*** * 静态工厂方法*/public static EagerSingleton getInstanc…

python链表排序_链表排序+末尾各种排序

#工具人排序def nums_sort(data):if not data:return []min_data min(data)max_data max(data)nums [0]*(max_data-min_data1)for value in data:nums[value-min_data]1cur min_datafor index in range (len(data)):while cur< max_data and nums[cur-min_data]<0:cu…