作者popcorny (毕业了..@@")
看板java
标题[心得] Java8的Optional心得建议
时间Tue Aug 5 14:04:52 2014
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
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.163.46.230
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/java/M.1407218695.A.F06.html
※ 编辑: popcorny (118.163.46.230), 08/05/2014 14:10:35
1F:推 TonyQ:推~ 08/05 14:37
2F:推 gmoz:先推再说 java8好多要学的XD 08/05 17:21
3F:推 yyc1217:java8有什麽好书吗? 虽然网路资料多但还是想看书 08/05 18:57
5F:推 swpoker:我觉得这些应该要用於内部的实作~而非对外的揭露 08/06 09:43
6F:→ popcorny:推楼上,这就是我要表达的意思 :) 08/06 13:15
7F:→ swpoker:例如spring中queryForXXX会抛出非一的错误而非回传null 08/06 16:41
8F:→ swpoker:我觉得这个要回归到本身程式面的流程及错误的定义 08/06 16:42
9F:→ swpoker:我有改过原本某方法是回传boolean作为成功或失败 08/06 16:43
10F:→ swpoker:但我确认该回传的用意是要用来中断用的->因此我改成错误 08/06 16:44
11F:→ swpoker:但有些却用抛出错误做为流程的一部分~那就不对了 08/06 16:44