Boolean 相關工具
UdeBooleanUtils 解決問題
- 使用者輸入有空白。
- 使用者輸入有全型字元。
- 資料交換用 0/1、Y/N、T/F 表示BOOLEAN值時。
- 指定剖析失敗時的預設值。
通常運用於實作資料交換邏輯。
與第三方套件、原生 API 比較
JDK Boolean
只能處理 "true" 轉換,所以忘了它吧!
Commons BooleanUtils
使用經驗上,在遇到前述中文輸入情境時,BooleanUtils 略有不足。
BooleanUtils.toBooleanObject(String)
Converts a String to a Boolean. 'true', 'on', 'y', 't' or 'yes' (case insensitive) will return true. 'false', 'off', 'n', 'f' or 'no' (case insensitive) will return false. Otherwise, null is returned. NOTE: This returns null and will throw a NullPointerException if autoboxed to a boolean.
UdeBooleanUtils 擴增
parseToObject(String text) :: Boolean 以 Commons BooleanUtils 為基準,去除輸入前後空白並支援增加全形字串表示式解析。另外 0 也視為 false;其它整數則視為 true。未列於上述格式的字串皆回傳NULL。
parse(String text, boolean defaultValue) :: boolean 解析原則同上,但強制要求指定無法解析時的預設值,以防止系統中的不明確狀態。
isTrue (String text) 等同 parse(String, false)
isFalse (String text) 等同 !parse(String, true)
格式化文字 (BooleanText 介面)
UDE 以BooleanText介面,定義 BOOL 與 TEXT 間的正反轉換。
public interface BooleanText { boolean isFalse(String text); // 字串是否可解讀為 FALSE,不分大小寫 boolean isTrue(String text); // 字串是否可解讀為 TRUE,不分大小寫 String toString(boolean bool); }
enum BooleanFormatter 包含幾個較常用的定義 (Yes_No,Y_N,True_False,T_F,ON_OFF)。
BooleanFormatter.Yes_No.toString(boolean) BooleanFormatter.Y_N.toString(boolean)
與 Commons Utils 的用法比較:
BooleanUtils.toStringOnOff(boolean) BooleanUtils.toStringTrueFalse(boolean) BooleanUtils.toStringYesNo(boolean)
LAMBDA 支援 (Predicate)
- 便於使用 method reference
- 提供 method reference : alwaysTrue / alwaysFalse 1
private boolean fooWithPredicate(final Predicate<Integer> tester, final Integer number) {
return tester.test(number);
}
private boolean isZero(Integer n) { return n == 0; }
private boolean gtTen(Integer n) { return n > 10; }
// 便於使用 method reference : NOT = .negate();
// 便於使用 method reference : AND/OR = .and(), .or;
@Test public void test_not() {
assertTrue(fooWithPredicate(this::isZero, 0));
assertFalse(fooWithPredicate(UdeBooleanUtils.not(this::isZero), 0));
}
@Test public void test_or() {
assertTrue(fooWithPredicate(UdeBooleanUtils.or(this::isZero, this::gtTen), 0));
assertFalse(fooWithPredicate(UdeBooleanUtils.or(this::isZero, this::gtTen), 10));
assertTrue(fooWithPredicate(UdeBooleanUtils.or(this::isZero, this::gtTen), 20));
}
@Test public void test_and() {
assertFalse(fooWithPredicate(UdeBooleanUtils.and(this::isZero, this::gtTen), 0));
assertFalse(fooWithPredicate(UdeBooleanUtils.and(this::isZero, this::gtTen), 10));
assertFalse(fooWithPredicate(UdeBooleanUtils.and(this::isZero, this::gtTen), 20));
}
@Test public void test_always() {
assertTrue(fooWithPredicate(UdeBooleanUtils::alwaysTrue, 0));
assertFalse(fooWithPredicate(UdeBooleanUtils::alwaysFalse, 0));
}
客制調適
以 BooleanText 抽換 UdeBooleanUtils 對 T/F 的判斷,會影響整個系統,慎用!
TODO 補充說明 :
- UdeBooleanUtilsSetup
- BooleanFormatter 定義