GroovyなJDK、それがGDK(String編その4)
このシリーズの一覧はこちら
はじめに
GroovyにはJavaの標準API(JDK)を拡張したGroovy JDK(GDK)があります。大量の便利メソッドが追加されており、これを使いこなすだけでも相当のことができるようになります。このシリーズでは毎回1クラスずつ各メソッドの使用例をサンプル付きでご紹介していきたいと思います。
「今回は java.lang.String です」
テスト系メソッド
変換系メソッド
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 // デコードできた