[心得] Java8的Optional心得建议

楼主: popcorny (毕业了..@@")   2014-08-05 14:04:52
Java8推出了Optional这个东西
目的是要解决NullPointerException
但是可能很多人会想说方法的传回值要使用Optional吗?
还是使用一般的形态?
我的建议基本上跟Ingram的看法很接近
http://ingramchen.io/blog/2014/04/java-8-new-api-tips.html
1. POJO不要回传Optional<T>
因为我认为这就不是POJO了 XD
2. DAO的query如果只有一个回传值
那可以回传Optional<T>
但是一定要有Optional<T>的instance回来
千万不要回传null。
3. DAO回传query如果是一个array
可以使用List<T>
没有值也要回传EmptyList
千万不要回传List<Optional<T>>
也不要Optional<List<T>>
其实我觉得最简单的原则应该是,
方法的传入值,传回值,field都不应该出现Optional
只能出现在local变量,或是只出现在Statement当中
所以上面的item2甚至我都觉得回传不要Optional都比较好
那我的POJO要怎么使用到Optional的好处?
假设以下nested-if的问题
String version = "UNKNOWN";
if(computer != null){
Soundcard soundcard = computer.getSoundcard();
if(soundcard != null){
USB usb = soundcard.getUSB();
if(usb != null){
version = usb.getVersion();
}
}
}
请改用
String version = Optional
.ofNullable(computer)
.map(Computer::getSoundcard)
.map(Soundcard::getUSB)
.map(USB::getVersion)
.orElse("UNKNOWN");
这个是Monad的用法,Monad很难言传,请用意会的。
如果真要讲,就是一般的POJO domain,
转成Optional domain,再回传到POJO domain。
就像傅立叶转换把spatial domain转成frequency domain一样。
这个比喻好像越比喻越复杂(踢飞)
另外对Monad有兴趣的,很建议看这篇。
http://www.slideshare.net/mariofusco/monadic-java
还有良葛格的文章
http://openhome.cc/Gossip/Java/Optional.html
作者: TonyQ (自立而后立人。)   2014-08-05 14:37:00
推~
作者: gmoz ( This can't do that. )   2014-08-05 17:21:00
先推再说 java8好多要学的XD
作者: yyc1217 (somo)   2014-08-05 18:57:00
java8有什么好书吗? 虽然网络资料多但还是想看书
作者: qrtt1 (有些事,有时候。。。)   2014-08-05 19:33:00
http://bit.ly/1tRCPsc Java SE 8 技术手册
作者: swpoker (swpoker)   2014-08-06 09:43:00
我觉得这些应该要用于内部的实作~而非对外的揭露
楼主: popcorny (毕业了..@@")   2014-08-06 13:15:00
推楼上,这就是我要表达的意思 :)
作者: swpoker (swpoker)   2014-08-06 16:41:00
例如spring中queryForXXX会抛出非一的错误而非回传null我觉得这个要回归到本身程式面的流程及错误的定义我有改过原本某方法是回传boolean作为成功或失败但我确认该回传的用意是要用来中断用的->因此我改成错误但有些却用抛出错误做为流程的一部分~那就不对了
作者: gmoz ( This can't do that. )   2014-08-06 21:47:00
http://www.codedata.com.tw/tag/jdk8/ 这网站我都还没看完XD

Links booklink

Contact Us: admin [ a t ] ucptt.com