提示文字提示文字提示文字提示文字提示文字提示文字
×
top
私人消息 (0)
公共消息 (0)
系統消息 (0)
好友消息 (0)
帖子消息 (0)
首 頁
技術文章
技術論壇
Java 頻道
提示文字提示文字提示文字提示文字提示文字提示文字
×
CodeData 技術論譠
»
Java SE
» 有關 Option、Either 與 Try
返回列表
發文章
caterpillar
目前離線
UID
2
文章
44
精華
0
積分
50
閱讀權限
200
在線時間
7 小時
註冊時間
2013-3-11
最後登入
2013-10-25
管理員
1
#
跳轉到
»
正序看文章
列印
字體大小:
t
T
caterpillar
發表於 2013-6-7 16:26
|
只看該作者
有關 Option、Either 與 Try
maybe
,
option
,
either
,
error-handling
在這篇文章中談到了 Optional:
http://www.codedata.com.tw/java/guava-tutorial-1-getting-started/
有在玩函數式程式設計語言的,像是 Scala,應該知道 Option,不過還有個 Either,事實上在 Haskell 中有 Maybe 及 Either…
有注意過 Scala 2.10 的,也會知道它增加了個 Try…
Option、Either 與 Try 的介紹,可以參考:
[Scala] 用 Option[T] 來避免 NullPointerException
[Scala] 比 Optiont[T] 再多一點的 Either[A, B]
[Scala] 比 Either[A, B] 再明確一點的 Try[T]
實際上,Scala 中的 try-catch 很有趣,它是運算式(Expression),會有傳回值,可以再參考一下:
[Scala] 2.10 新增的 Try 錯誤處理類別
看出什麼了嗎?Option、Either 或語意更明確的 Try,都是函數式風格的錯誤處理元素,所以我今天針對「函數式風格錯誤處理」寫了篇 iThome 專欄!…大概在一個多月後會出現在 iThome …XD
caterpillar
目前離線
UID
2
文章
44
精華
0
積分
50
閱讀權限
200
在線時間
7 小時
註冊時間
2013-3-11
最後登入
2013-10-25
管理員
8
#
caterpillar
發表於 2013-7-25 16:48
|
只看該作者
函數式風格錯誤處理
http://www.ithome.com.tw/itadm/article.php?c=81622
TOP
caterpillar
目前離線
UID
2
文章
44
精華
0
積分
50
閱讀權限
200
在線時間
7 小時
註冊時間
2013-3-11
最後登入
2013-10-25
管理員
7
#
caterpillar
發表於 2013-6-27 17:08
|
只看該作者
回復
6#
Steven Yang
Either 基本上就是左值與右值,只不過右這個名字在英文是 Right,這是老外的幽默,就像是 ... Your left brain has nothing right ... You right brain has nothing left ... XD
雖然文件上都建議左值用來承載錯誤資訊,右值用來表示正確結果,不過確實還是用 Try 會更為明確,不過純函數式中沒有(或只是我沒看過)try ... catch 的觀念,因此從這點來看,純函數式中用 Either 是可以理解的。
TOP
Steven Yang
目前離線
UID
484
文章
3
精華
0
積分
0
閱讀權限
10
在線時間
1 小時
註冊時間
2013-6-27
最後登入
2013-6-29
新手上路
6
#
Steven Yang
發表於 2013-6-27 16:17
|
只看該作者
我覺得Try比Either不止更明確,它還可以用for comprehension
之前用Either用到把scalaz拿來用就為了Validation而已
TOP
caterpillar
目前離線
UID
2
文章
44
精華
0
積分
50
閱讀權限
200
在線時間
7 小時
註冊時間
2013-3-11
最後登入
2013-10-25
管理員
5
#
caterpillar
發表於 2013-6-7 16:45
|
只看該作者
在 Java 中寫個 Try,然後配合 JDK8 Lambda 語法,大概像是這樣:
abstract class Try<T> {
abstract boolean isSuccess();
boolean isFailure() { return ! isSuccess(); }
abstract T get();
abstract Exception resolve();
static <T> Try<T> tryIt(F<T> f) {
try { return new Success<T>(f.apply());
} catch(Exception e) { return new Failure<T>(e); }
}
}
final class Success<T> extends Try<T> {
private T value;
Success(T v) { this.value = v; }
boolean isSuccess() { return true; }
T get() { return value; }
Exception resolve() { throw new IllegalStateException(); }
}
final class Failure<T> extends Try<T> {
private Exception e;
Failure(Exception e) { this.e = e; }
boolean isSuccess() { return false; }
T get() { throw new IllegalStateException(); }
Exception resolve() { return e; }
}
interface F<T> {
T apply();
}
public class Test {
public static void main(String[] args) {
Try<Integer> result = Try.tryIt(() -> Integer.parseInt(args[0]));
if(result.isSuccess()) {
System.out.println(result.get());
} else {
System.out.println(result.resolve());
}
}
}
複製程式碼
當然,跟 Scala 比起來,還是囉嗦了一點,不過總是進步了一些…XD
TOP
caterpillar
目前離線
UID
2
文章
44
精華
0
積分
50
閱讀權限
200
在線時間
7 小時
註冊時間
2013-3-11
最後登入
2013-10-25
管理員
4
#
caterpillar
發表於 2013-6-7 16:42
|
只看該作者
因為有 iThome 要有備稿,而我大概有三、四篇備稿啊!…XD
TOP
longbao738
目前離線
UID
27
文章
1
精華
0
積分
0
閱讀權限
10
在線時間
0 小時
註冊時間
2013-5-20
最後登入
2013-6-7
新手上路
3
#
longbao738
發表於 2013-6-7 16:35
|
只看該作者
回復
1#
caterpillar
一個多月後
這時間也太久了
TOP
caterpillar
目前離線
UID
2
文章
44
精華
0
積分
50
閱讀權限
200
在線時間
7 小時
註冊時間
2013-3-11
最後登入
2013-10-25
管理員
2
#
caterpillar
發表於 2013-6-7 16:32
|
只看該作者
話說每次寫硬式文章都騙不到幾個讚 … XD
TOP
返回列表
MySQL
Conference
Java Open Source
Languages on JVM
站務討論區
Java EE
Oracle Database
User Group
Java Certification
Android
Java 技術
Java SE
Java EE
Java Open Source
Languages on JVM
Java Certification
資料庫
Oracle Database
MySQL
行動裝置
Android
iOS
社交程式設計 - Social Coding
Chat
Github
Conference
User Group
Python
管理區
站務公告區
站務討論區