GroovyなJDK、それがGDK(String編その5)
このシリーズの一覧はこちら
はじめに
GroovyにはJavaの標準API(JDK)を拡張したGroovy JDK(GDK)があります。大量の便利メソッドが追加されており、これを使いこなすだけでも相当のことができるようになります。このシリーズでは毎回1クラスずつ各メソッドの使用例をサンプル付きでご紹介していきたいと思います。
「今回は java.lang.String です」
String編その5では演算子系のメソッドをご紹介します。それでは早速見て行きましょう。
演算子系メソッド
- String plus(Object value)
- String minus(Object target)
- String multiply(Number factor)
- String next()
- String previous()
- StringBuffer leftShift(Object value)
- Pattern bitwiseNegate()
- String getAt(int index)
- String getAt(IntRange range)
- String getAt(Range range)
- String getAt(EmptyRange range)
- String getAt(Collection indices)
- boolean isCase(Object switchValue)
- Object asType(Class c)
Pattern bitwiseNegate() [since v1.5.0]
#bigwiseNegate「~」はGroovyの演算子オーラーライド*1用に用意されているメソッド名のうちの一つ。
~/[0-9]+/ // => Pattern (正規表現) /[0-9]/.bitwiseNegate() // => Pattern (正規表現)
String getAt(int index) [since v1.0]
assert 'a' == 'abcde'.getAt(0)
こんな感じで文字列をインデックスアクセス可能。
また、#getAtは 変数[index] 演算子をオーバーライドするため、以下のような記述が可能です。
assert 'b' == 'abcde'[1] // getAt(1)と同じ意味 assert 'e' == 'abcde'[4] // getAt(5)と同じ意味
マイナスのindexアクセスも可能です。
assert 'e' == 'abcde'[-1] // getAt(-1)と同じ意味 assert 'a' == 'abcde'[-5] // getAt(-5)と同じ
ただし、インデックスアクセスなので範囲を超えた場合は例外が発生します。
'abcde'[5] // java.lang.StringIndexOutOfBoundsException発生 'abcde'[-6] // java.lang.ArrayIndexOutOfBoundsException発生
String getAt(IntRange range) [since v1.0]
#getAt(int)のIntRange版です。
特定の範囲のindexについて文字列から抜き出します。
assert 'abc' == 'abcde'.getAt(0..2)
こんな感じで文字列をインデックス範囲でアクセス可能。
また、#getAtは 変数[index] 演算子をオーバーライドするため、以下のような記述が可能です。
assert 'bc' == 'abcde'[1..2] // getAt(1..2)と同じ意味 assert 'bcde' == 'abcde'[1..<5] // getAt(1..<5)と同じ意味
String getAt(EmptyRange range) [since v1.5.0]
assert '' == 'abcde'.getAt(new EmptyRange()) assert '' == 'abcde'[new EmptyRange()] assert '' == 'abcde'[]
boolean isCase(Object switchValue) [since v1.0]
Stringのcaseの実装。ここではString#equals(Object)となっている。
def str = 'abc' switch(str) { case '123' : println 'Not comes here.'; break case 'abc' : println 'Comes here.'; break // str.isCase('abc') が呼ばれtrueとなる default : println 'Not comes here.'; break }
Object asType(Class c) [since v1.0]
これは文字列の内容から動的に型変換を行ってくれるメソッドです。#asTypeはそのまま使ってもいいんですが、「as class」の形のシンタクスシュガーが用意されているのでそちらを使ったほうがGroovy流です。
引数(Class c)には List, BigDecimal, BigInteger, Long, Integer, Short, Byte, Character, Double, Float, File, Enumのサブクラス (Java5以降)が指定できます。それ以外のクラスが指定された場合はObject#asTypeに委譲されます。
'10'.asType(int) // => intの10 '10' as int // => intの10 // as classの形でも#asTypeの形でも書ける。 // また、intなどの型はGroovyではIntegerなどのラッパークラスのエイリアスであるため、 // 以降のサンプルは as classの形、型はエイリアスの方で統一。 'abc' as List // => ['a', 'b', 'c'] '10' as BigDecimal // => BigDecimalの10 '10' as BigInteger // => BigIntegerの10 '10' as long // longの10L '10' as short // shortの10 '10' as byte // byteの10 '1' as char // charの'1' '10' as double // doubleの10.0 '10' as float // floatの10.0 'sample.txt' as File // => new File('sample.txt') と同じ enum Sex { MAN, WOMAN } 'MAN' as Sex // => Sex.MAN