GoogleのJavaライブラリGuavaの使い方

Google Guavaの機能と使い方について説明する。

文字列を操作するクラス

ここでは基本クラスを扱う。基本クラスには、主に文字列を操作するクラスがある。文字列そのものを扱うStringsクラス、文字列を結合するJoinerクラス、文字列を分割するSplitterクラスがある。

Stringsクラス

Stringsクラスは文字列を操作するためのクラスである。nullと空文字を検証または操作するために、isNullOrEmpty()emptyToNull()nullToEmpty()メソッドがある。

それぞれの使い方と実行結果を見てみよう。

isNullOrEmpty()

まずisNullOrEmptyメソッドの例である。引数の値がnullまたは空文字の場合にtrueを返す。値がある場合はfalseを返す。半角スペースだけの場合もfalseである。

Strings.isNullOrEmpty(null); // "true"가 반환된다.
Strings.isNullOrEmpty("");   // "true"가 반환된다.
Strings.isNullOrEmpty("a");  // "false"가 반환된다.
Strings.isNullOrEmpty(" ");  // "false"가 반환된다.
package com.devkuma.guava.strings;

import com.google.common.base.Strings;

public class StringIsNullOrEmpty {
    public static void main(String[] args) {
        System.out.println(Strings.isNullOrEmpty(null));
        System.out.println(Strings.isNullOrEmpty(""));
        System.out.println(Strings.isNullOrEmpty("a"));
        System.out.println(Strings.isNullOrEmpty(" "));
    }
}

実行結果:

true
true
false
false

commonPrefix(), commonSuffix()

引数に指定された2つの文字列から、共通する接頭辞または接尾辞の文字列を返す。

// commonPrefix
Strings.commonPrefix("abc12345", "abcABCDE"); // "abc"가 반환된다.
Strings.commonPrefix("setHoge", "setMoge");   // "set"가 반환된다.

// commonSuffix
Strings.commonSuffix("12345abc", "ABCabc");  // "abc"가 반환된다.
Strings.commonSuffix("removable", "usable"); // "able"가 반환된다.
package com.devkuma.guava.strings;

import com.google.common.base.Strings;

public class StringCommonPrefixCommonSuffix {

    public static void main(String[] args) {
        // commonPrefix
        System.out.println(Strings.commonPrefix("abc12345", "abcABCDE"));
        System.out.println(Strings.commonPrefix("setHoge", "setMoge"));

        // commonSuffix
        System.out.println(Strings.commonSuffix("12345abc", "ABCabc"));
        System.out.println(Strings.commonSuffix("removable", "usable"));
    }
}

実行結果:

abc
set
abc
able

padStart(), padEnd()

文字列の長さが指定された長さになるまで、指定した文字でパディングを行い、文字列を返す。

// padStart
Strings.padStart("123", 5, '0'); // "00123"가 반환된다.

// padEnd
Strings.padEnd("123", 5, '0'); // "12300"가 반환된다.
package com.devkuma.guava.strings;

import com.google.common.base.Strings;

public class StringPadStartPadEnd {
    public static void main(String[] args) {
        // padStart
        Strings.padStart("123", 5, '0');

        // padEnd
        Strings.padEnd("123", 5, '0');
    }
}

実行結果:

00123
12300

repeat()

引数で指定した文字列を、指定した回数だけ繰り返した文字列を返す。

Strings.repeat("0", 10);  // "0000000000"가 반환된다.
Strings.repeat("hey", 3); // "heyheyhey"가 반환된다.
package com.devkuma.guava.strings;

import com.google.common.base.Strings;

public class StringRepeat {
    public static void main(String[] args) {
        System.out.println(Strings.repeat("0", 10));
        System.out.println(Strings.repeat("hey", 3));
    }
}

実行結果:

0000000000
heyheyhey

Joinerクラス

Joinerクラスは文字列の結合を簡単にするクラスである。さまざまな結合方法を提供している。

Array join()

文字列配列の結合。 次の例は、カンマで結合する例である。

//  "abc, def, ghi"의 문자열이 반환된다.
String[] values = {"abc", "def", "ghi"};
String result = Joiner.on(',').join(values);
package com.devkuma.guava.joiner;

import com.google.common.base.Joiner;

public class JoinerArrayJoin {
    public static void main(String[] args) {
        String[] values = {"abc", "def", "ghi"};
        String result = Joiner.on(',').join(values);

        System.out.println(result);
    }
}

実行結果:

abc,def,ghi

List join()

文字列のリストも結合できる。

List values = new ArrayList();
values.add("abc");
values.add("def");
values.add("ghi");
String result = Joiner.on(',').join(values);
package com.devkuma.guava.joiner;

import java.util.ArrayList;
import java.util.List;

import com.google.common.base.Joiner;

public class JoinerArrayJoin {
    public static void main(String[] args) {
        List values = new ArrayList();
        values.add("abc");
        values.add("def");
        values.add("ghi");
        String result = Joiner.on(',').join(values);

        System.out.println(result);
    }
}

実行結果:

abc,def,ghi

skipNulls()

skipNullsメソッドを使用すると、結合時にnull値をスキップできる。

// 다음 예제의 경우 "abc, ghi"가 반환된다.
List values = new ArrayList();
values.add("abc");
values.add(null);
values.add("ghi");
String result = Joiner.on(',').skipNulls().join(values);
package com.devkuma.guava.joiner;

import java.util.ArrayList;
import java.util.List;

import com.google.common.base.Joiner;

public class JoinerSkipNullsJoin {
    public static void main(String[] args) {
        List values = new ArrayList();
        values.add("abc");
        values.add(null);
        values.add("ghi");
        String result = Joiner.on(',').skipNulls().join(values);

        System.out.println(result);
    }
}

実行結果:

abc,ghi

Map結合

Mapを引数として使用し、KeyValue文字列を作成することもできる。

// "name=tom&age=20" 값이 반환된다.
Map map = new HashMap();
map.put("name", "tom");
map.put("age", "20");
String result = Joiner.on('&').withKeyValueSeparator("=").join(map);
package com.devkuma.guava.joiner;

import java.util.HashMap;
import java.util.Map;

import com.google.common.base.Joiner;

public class JoinerWithKeyValueSeparator {
    public static void main(String[] args) {
        Map map = new HashMap();
        map.put("name", "tom");
        map.put("age", "20");
        String result = Joiner.on('&').withKeyValueSeparator("=").join(map);

        System.out.println(result);
    }
}

実行結果:

name=tom&age=20

Splitterクラス

Splitterクラスは文字列の分割を助けるクラスである。文字数、指定した文字、KeyValueなど、さまざまな基準で文字列を分割できる。

fixedLength()

SplitterクラスのfixedLengthメソッドを使用すると、指定された文字数で文字列を分割できる。

// 다음의 경우 "abcde", "fghij", "klmn"의 문자열 목록이 반환됩니다.
List list = Splitter.fixedLength(5).splitToList("abcdefghijklmn");
package com.devkuma.guava.splitter;

import java.util.List;

import com.google.common.base.Splitter;

public class SplitterFixedLength {
    public static void main(String[] args) {
        List list = Splitter.fixedLength(5).splitToList("abcdefghijklmn");

        System.out.println(list);
    }
}

実行結果:

[abcde, fghij, klmn]

on()

Splitterクラスのonメソッドを使用すると、指定された文字で文字列を分割できる。

// 다음은 쉼표로 문자열을 분할하고 "devkuma", "araikuma", "kimkc" 문자열 목록을 반환한다.
List list = Splitter.on(',').splitToList("devkuma,araikuma,kimkc");
package com.devkuma.guava.splitter;

import java.util.List;

import com.google.common.base.Splitter;

public class SplitterOn {

    public static void main(String[] args) {
        List list = Splitter.on(',').splitToList("devkuma,araikuma,kimkc");

        System.out.println(list);
    }
}

実行結果:

[devkuma, araikuma, kimkc]

Map分割

KeyValue形式の文字列、たとえばクエリ文字列のような文字列を分解する。

// 다음의 경우, 키 "name"에 "tom", 키 "age"에 "20"이 저장된 Map이 반환된다.
Splitter.on("&").trimResults().withKeyValueSeparator('=').split("name=devkuma&age=20");
package com.devkuma.guava.splitter;

import java.util.Map;

import com.google.common.base.Splitter;

public class SplitterWithKeyValueSeparator {

    public static void main(String[] args) {
        Map<String, String> map = Splitter.on("&").trimResults().withKeyValueSeparator('=').split("name=devkuma&age=20");

        System.out.println(map);
    }
}

実行結果:

{name=devkuma, age=20}

Range

Rangeを使用すると、指定した数値や文字が範囲内かどうかを判定しやすくなる。

package com.devkuma.guava.range;

import com.google.common.collect.Range;

public class RangeContains {

    public static void main(String[] args) {
        Range<Integer> range = Range.closed(1, 10); //open 은 등호 제외  1 < x < 10

        int target = 3;

        if (range.contains(target)) { // if (target >= 1 && target <= 10)
            System.out.println("1 ~ 10 범위");
        }
    }
}

実行結果:

1 ~ 10 범위