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 定義

results matching ""

    No results matching ""