No Programming, No Life

プログラミング関連の話題や雑記

GroovyなJDK、それがGDK(String編その4)


このシリーズの一覧はこちら

はじめに

GroovyにはJavaの標準API(JDK)を拡張したGroovy JDK(GDK)があります。大量の便利メソッドが追加されており、これを使いこなすだけでも相当のことができるようになります。このシリーズでは毎回1クラスずつ各メソッドの使用例をサンプル付きでご紹介していきたいと思います。
「今回は java.lang.String です」


String編その4ではテスト系と変換系のメソッドをご紹介します。それでは早速見て行きましょう。

boolean isAllWhitespace() [since v?]

空白文字列だけで構成されているかどうかを返却します。

assert ''.isAllWhitespace()
assert ' '.isAllWhitespace() // 半角スペース
assert ' '.isAllWhitespace() // 全角スペース
assert '\t'.isAllWhitespace() // タブ
assert '\r\n'.isAllWhitespace() // 改行
assert !' a '.isAllWhitespace()

全角スペースもいけるみたいです。

boolean isBigDecimal() [since v1.5.0]

この文字列をBigDecimalに変換できるかどうかを返却します。

assert '10'.isBigDecimal()
assert '1.23'.isBigDecimal()
assert '123.45'.isBigDecimal() // 全角もOK
assert !''.isBigDecimal()
assert !'abc'.isBigDecimal()
assert !'1.23G'.isBigDecimal() // なぜかBigDecimalリテラル表現の筈の'G'が入っているとダメらしい…

参照: BigInteger, BigDecimalって全角OKなんだね - No Programming, No Life

boolean isBigInteger() [since v1.5.0]

この文字列をBigIntegerに変換できるかどうかを返却します。

assert '10'.isBigInteger()
assert '10'.isBigInteger() // 全角もOK
assert !'1.23'.isBigInteger()
assert !''.isBigInteger()
assert !'abc'.isBigInteger()
assert !'10G'.isBigDecimal() // なぜかBigIntegerリテラル表現の筈の'G'が入っているとダメらしい…

参照: BigInteger, BigDecimalって全角OKなんだね - No Programming, No Life

boolean isDouble() [since v1.5.0]

この文字列をDoubleに変換できるかどうかを返却します。

assert '10'.isDouble()
assert '10d'.isDouble()
assert '10D'.isDouble()
assert '1.23'.isDouble()
assert '1.23d'.isDouble()
assert '1.23D'.isDouble()
assert '1.23E100'.isDouble()
assert !''.isDouble()
assert !'abc'.isDouble()

boolean isFloat() [since v1.5.0]

この文字列をFloatに変換できるかどうかを返却します。

assert '10'.isFloat()
assert '10f'.isFloat()
assert '10F'.isFloat()
assert '1.23'.isFloat()
assert '1.23f'.isFloat()
assert '1.23F'.isFloat()
assert '1.23E100'.isFloat()
assert 'Infinity'.isFloat()
assert '-Infinity'.isFloat()
assert 'NaN'.isFloat()
assert !''.isFloat()
assert !'abc'.isFloat()

boolean isInteger() [since v1.5.0]

この文字列をIntegerに変換できるかどうかを返却します。

assert '10'.isInteger()
assert !'1.23'.isInteger()
assert !'1.23E100'.isInteger()
assert !''.isInteger()
assert !'abc'.isInteger()

boolean isLong() [since v1.5.0]

この文字列をLongに変換できるかどうかを返却します。

assert '10'.isLong()
assert !'10l'.isLong() // リテラル表現はダメ
assert !'10L'.isLong() // リテラル表現はダメ
assert !'1.23'.isLong()
assert !'1.23E100'.isLong()
assert !''.isLong()
assert !'abc'.isLong()

boolean isNumber() [since v1.5.0]

この文字列をNumberに変換できるかどうかを返却します。

assert '10'.isNumber()
assert !'10G'.isNumber() // リテラル表現はダメ
assert !'10F'.isNumber() // リテラル表現はダメ
assert '1.23'.isNumber()
assert '1.23f'.isNumber()
assert '1.23F'.isNumber()
assert '1.23E100'.isNumber()
assert !''.isNumber()
assert !'abc'.isNumber()

char[] getChars() [since v1.6.0]

toCharArray()エイリアス
文字列をchar配列に変換します。

assert ['a', 'b', 'c'] as char[] == 'abc'.getChars()
assert ['a', 'b', 'c'] as char[] == 'abc'.chars

BigDecimal toBigDecimal() [since v1.0]

この文字列をBigDecimalに変換します。

assert 10G     == '10'.toBigDecimal()
assert 1.23G   == '1.23'.toBigDecimal()
assert 123.45G == '123.45'.toBigDecimal() // 全角もOK

以下の場合は例外が発生します。

class toBigDecimalTest extends GroovyTestCase {
  void test() {
    shouldFail(java.lang.NumberFormatException) {
      ''.toBigDecimal()
    }
    shouldFail(java.lang.NumberFormatException) {
      'abc'.toBigDecimal()
    }
    // なぜかBigDecimalリテラル表現の筈の'G'が入っているとダメらしい…
    shouldFail(java.lang.NumberFormatException) {
      '1.23G'.toBigDecimal()
    }
  }
}

参照: BigInteger, BigDecimalって全角OKなんだね - No Programming, No Life

BigInteger toBigInteger() [since v1.0]

この文字列をBigIntegerに変換します。

assert 10G == '10'.toBigInteger()
assert 10G == '10'.toBigInteger() // 全角もOK

以下の場合は例外が発生します。

class toBigDecimalTest extends GroovyTestCase {
  void test() {
    shouldFail(java.lang.NumberFormatException) {
      '1.23'.toBigInteger()
    }
    shouldFail(java.lang.NumberFormatException) {
      ''.toBigInteger()
    }
    shouldFail(java.lang.NumberFormatException) {
      'abc'.toBigInteger()
    }
    // なぜかBigIntegerリテラル表現の筈の'G'が入っているとダメらしい…
    shouldFail(java.lang.NumberFormatException) {
      '10G'.toBigDecimal()
    }
  }
}

参照: BigInteger, BigDecimalって全角OKなんだね - No Programming, No Life

Boolean toBoolean() [since v1.0]

トリムした文字列が"true", "y" or "1"(大文字小文字は区別しない)の場合はtrueに、そうでなければfalseに変換します。

assert 'true'.toBoolean()
assert ' TRUE '.toBoolean()
def str1 = 'ru'
assert "t${str1}e".toBoolean()
assert 'tRuE'.toBoolean()
assert 'y'.toBoolean()
assert ' Y '.toBoolean()
assert '\ty\t'.toBoolean()
assert '1'.toBoolean()
assert ' 1 '.toBoolean()

assert !'TR UE'.toBoolean()
assert !'false'.toBoolean()
assert !' FALSE '.toBoolean()
def str2 = 'als'
assert !"f${str2}e".toBoolean()
assert !'fAlSe'.toBoolean()
assert !'n'.toBoolean()
assert !' N '.toBoolean()
assert !'\tn\t'.toBoolean()
assert !'0'.toBoolean()
assert !' 0 '.toBoolean()

Character toCharacter() [since v1.0]

この文字列の最初も1文字をcharに変換します。

assert ('a' as char) == 'abc'.toCharacter()
assert ('a' as char) == 'a'.toCharacter()
def str = 'abc'
assert str[0] == str.toCharacter()

以下の場合は例外が発生します。

class toCharacterTest extends GroovyTestCase {
  void test1() {
    // 空文字はエラー
    shouldFail(java.lang.StringIndexOutOfBoundsException) {
      ''.toCharacter()
    }
  }
}

Double toDouble() [since v1.0]

この文字列をdoubleに変換します。

assert 10d      == '10'.toDouble()
assert 10d      == '10d'.toDouble()
assert 10d      == '10D'.toDouble()
assert 1.23d    == '1.23'.toDouble()
assert 1.23d    == '1.23d'.toDouble()
assert 1.23d    == '1.23D'.toDouble()
assert 1.23E100 == '1.23E100'.toDouble()

以下の場合は例外が発生します。

class toDoubleTest extends GroovyTestCase {
  void test() {
    // 空文字はエラー
    shouldFail(java.lang.NumberFormatException) {
      ''.toDouble()
    }
    // doubleに変換できない文字列はエラー
    shouldFail(java.lang.NumberFormatException) {
      'abc'.toDouble()
    }
  }
}

Float toFloat() [since v1.0]

この文字列をfloatに変換します。

assert 10f   == '10'.toFloat()
assert 10f   == '10f'.toFloat()
assert 10f   == '10F'.toFloat()
assert 1.23f == '1.23'.toFloat()
assert 1.23f == '1.23f'.toFloat()
assert 1.23f == '1.23F'.toFloat()
assert Float.POSITIVE_INFINITY == '1.23E100'.toFloat()
assert Float.NEGATIVE_INFINITY == '-1.23E100'.toFloat()
assert Float.NaN               == 'NaN'.toFloat()

以下の場合は例外が発生します。

class toFloatTest extends GroovyTestCase {
  void test() {
    // 空文字はエラー
    shouldFail(java.lang.NumberFormatException) {
      ''.toFloat()
    }
    // floatに変換できない文字列はエラー
    shouldFail(java.lang.NumberFormatException) {
      'abc'.toFloat()
    }
  }
}

Integer toInteger() [since v1.0]

この文字列をintに変換します。

assert (10 as int) == '10'.toInteger()

以下の場合は例外が発生します。

class toIntegerTest extends GroovyTestCase {
  void test() {
    // 空文字はエラー
    shouldFail(java.lang.NumberFormatException) {
      ''.toInteger()
    }
    // intに変換できない文字列はエラー
    shouldFail(java.lang.NumberFormatException) {
      '1.23'.toInteger()
    }
    shouldFail(java.lang.NumberFormatException) {
      '1.23E100'.toInteger()
    }
    shouldFail(java.lang.NumberFormatException) {
      'abc'.toInteger()
    }
  }
}

Long toLong() [since v1.0]

この文字列をlongに変換します。

assert 10L == '10'.toLong()

以下の場合は例外が発生します。

class toLongTest extends GroovyTestCase {
  void test() {
    // リテラル表現はダメ
    shouldFail(java.lang.NumberFormatException) {
      '10l'.toLong()
    }
    shouldFail(java.lang.NumberFormatException) {
      '10L'.toLong()
    }
    // 空文字はエラー
    shouldFail(java.lang.NumberFormatException) {
      ''.toLong()
    }
    // longに変換できない文字列はエラー
    shouldFail(java.lang.NumberFormatException) {
      '1.23'.toLong()
    }
    shouldFail(java.lang.NumberFormatException) {
      '1.23E100'.toLong()
    }
    shouldFail(java.lang.NumberFormatException) {
      'abc'.toLong()
    }
  }
}

Short toShort() [since v1.5.7]

この文字列をshortに変換します。

assert (10 as short) == '10'.toShort()

以下の場合は例外が発生します。

class toShortTest extends GroovyTestCase {
  void test() {
    // 空文字はエラー
    shouldFail(java.lang.NumberFormatException) {
      ''.toShort()
    }
    // intに変換できない文字列はエラー
    shouldFail(java.lang.NumberFormatException) {
      '1.23'.toShort()
    }
    shouldFail(java.lang.NumberFormatException) {
      '1.23E100'.toShort()
    }
    shouldFail(java.lang.NumberFormatException) {
      'abc'.toShort()
    }
  }
}

URI toURI() [since v1.0]

この文字列をURIに変換します。

def uri = 'http://fumokmm@www.yyy.zzz:8000/aaa/bbb/ccc.cgi?KEY=CGI#XYZ'.toURI()
assert 'http' == uri.scheme
assert 'XYZ' == uri.fragment
assert 'fumokmm' == uri.userInfo
assert 'fumokmm@www.yyy.zzz:8000' == uri.authority
assert 'www.yyy.zzz' == uri.host
assert 8000 == uri.port
assert '/aaa/bbb/ccc.cgi' == uri.path
assert 'KEY=CGI' == uri.query
assert '//fumokmm@www.yyy.zzz:8000/aaa/bbb/ccc.cgi?KEY=CGI' == uri.schemeSpecificPart

URL toURL() [since v1.0]

この文字列をURLに変換します。

def url = 'http://fumokmm@www.yyy.zzz:8000/aaa/bbb/ccc.cgi?KEY=CGI#XYZ'.toURL()
assert 'http' == url.protocol
assert '/aaa/bbb/ccc.cgi?KEY=CGI' == url.file
assert 'fumokmm' == url.userInfo
assert 'fumokmm@www.yyy.zzz:8000' == url.authority
assert 'www.yyy.zzz' == url.host
assert 8000 == url.port
assert '/aaa/bbb/ccc.cgi' == url.path
assert 'KEY=CGI' == url.query
assert 'XYZ' == url.ref

byte[] decodeBase64() [since v1.0]

Base64文字列をデコードしてbyte[]に戻します。すごく便利なメソッドです。
対になるByte#encodeBase64()も参照。

byte[] byteArray = 'No Programming, No Life'.getBytes()
assert byteArray == [78, 111, 32, 80, 114, 111, 103, 114, 97, 109, 109, 105, 110, 103, 44, 32, 78, 111, 32, 76, 105, 102, 101]
def base64Str = byteArray.encodeBase64().toString()
assert base64Str == 'Tm8gUHJvZ3JhbW1pbmcsIE5vIExpZmU='
assert base64Str.decodeBase64() == byteArray // デコードできた