読者です 読者をやめる 読者になる 読者になる

No Programming, No Life

新しいNPNLです。http://d.hatena.ne.jp/fumokmm/ から引っ越してきました。

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


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

はじめに

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


String編その5では演算子系のメソッドをご紹介します。それでは早速見て行きましょう。

String plus(Object value) [since v1.0]

// TODO 調査中

String minus(Object target) [since v1.0]

// TODO 調査中

String multiply(Number factor) [since v1.0]

// TODO 調査中

String next() [since v1.0]

// TODO 調査中

String previous() [since v1.0]

// TODO 調査中

StringBuffer leftShift(Object value) [since v1.0]

// TODO 調査中

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(Range range) [since v1.0]

// TODO 調査中

String getAt(EmptyRange range) [since v1.5.0]

assert '' == 'abcde'.getAt(new EmptyRange())
assert '' == 'abcde'[new EmptyRange()]
assert '' == 'abcde'[]

String getAt(Collection indices) [since v1.0]

// TODO 調査中

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
}

出力結果

Comes here.

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

*1:[http://d.hatena.ne.jp/fumokmm/20100605/1275736594:title]の「演算子のオーバーライド」参照。