一次与大佬讨论Optional的记录

今天遇到了Optional的问题,所以请教了一下大佬,下面如实记录与大佬的探讨过程:
大佬:Optional就可以有效防止(NPE)NullPointException;配合stream使用的。

弱鸡的我:嗯,简单看,好像是包裹一个有可能返回null的对象?

大佬:对,它有两种方式生成对象;
这里写图片描述
ofNullable,这个方法生成的Optional对象可以如果目标对象为null会返回一个空Optional对象 不会返回null。

弱鸡的我:get如果是空会抛异常是吧。

大佬:对 所以他还有一个方法;
这里写图片描述
就是这个ifPresent,可以判断获取的值是否存在,在调用get之前调用这个。
orElseThrow,还有这个方法,等于是包含了get的方法,然后如果获取不到orElseThrow可以设置返回错误信息。
举个例子:
这里写图片描述
比如这个就是获取test对象中的a的值然后设置为43333,然后跟43333比较 为true就返回a的值,false就返回sb,当前方法应该是返回43333。
返回值为true
改了字符串x和x值比较以后,就返回sb了。
返回值为false
设置为null也不会有问题,但是如果把x直接设置为null就无法通过编译,保证了不会出现NPE。
这里写图片描述

弱鸡的我:map这个方法可以直接修改值?

大佬:当然可以

弱鸡的我:这是它的唯一作用吗?

大佬:这个解释起来就没那么简单了。
这里写图片描述
看这个map实现,括号中的参数是Function。这个接口只有一个方法apply。
这里写图片描述
当你传入参数的时候传入的是这里写图片描述
一个lambda表达式,Lambda实现了Function接口的,然后如果传入的lambda表达式不为null就会回调lambda的apply方法,然后黄框内的方法体就会被执行,所以实现了修改内容。如果是null,就会返回一个空的Optional对象。
map的意义不在于修改值 而是提供一种函数式的方式能够把lambda运用到对象上,实现一种流式操作,简化代码。如果采用传统的方式 可能这段代码要写4 ,5行甚至更多,还要进行空指针的判断。

弱鸡的我:但是map中如果不使用lambda,而使用匿名内部类的456行方式,是不是就没办法把相应的函数方程执行了?

大佬:你可以自定义匿名内部类实现Function接口,然后实现apply函数,达到同样的效果。
这里写图片描述

至此和大佬的探讨就告一段落,当然最后肯定时少不了一番商业吹捧的,嘿嘿嘿
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值