今天遇到了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。
改了字符串x和x值比较以后,就返回sb了。
设置为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函数,达到同样的效果。