Guava Spiltter —— 拆分器
Splitter 提供了各种方法来处理分割操作字符串,对象等。
一、类声明
以下是 com.google.common.base.Splitter 类的声明:
@GwtCompatible(emulated=true) public final class Splitter extends Object
二、类方法
| 修饰符和类型 | 方法说明 | 
|---|---|
| static Splitter | fixedLength(int length)初始化拆分器,拆分器会将字符串分割为元素长度固定的List,最后一个元素长度不足可以直接返回. | 
| Splitter | limit(int limit)限制拆分出的字符串数量 | 
| Splitter | omitEmptyStrings()从结果中自动忽略空字符串. | 
| static Splitter | on(char separator)初始化拆分器,参数为分隔符. | 
| static Splitter | on(CharMatcher separatorMatcher)初始化拆分器,参数为分隔符. | 
| static Splitter | on(Pattern separatorPattern)初始化拆分器,参数为分隔符. | 
| static Splitter | on(String separator)初始化拆分器,参数为分隔符. | 
| static Splitter | onPattern(String separatorPattern)返回一个拆分器,它将与给定模式(正则表达式)匹配的任何子序列视为分隔符. | 
| Iterable<String> | split(CharSequence sequence)对Stirng通过拆分器进行拆分,返回一个Iterable | 
| List<String> | splitToList(CharSequence sequence)将序列拆分为字符串组件并将其作为不可变列表返回. | 
| Splitter | trimResults()修饰拆分器,拆分器做拆分操作时,会对拆分的元素做trim操作(删除元素头和尾的空格),相当于 trimResults(CharMatcher.whitespace()). | 
| Splitter | trimResults(CharMatcher trimmer)修饰拆分器,拆分器做拆分操作时,会删除元素头尾charMatcher匹配到的字符. | 
| Splitter.MapSplitter | withKeyValueSeparator(char separator)初始化一个Map拆分器,拆分器对String拆分时,separator为key和value之间的分隔符. | 
| Splitter.MapSplitter | withKeyValueSeparator(Splitter keyValueSplitter)初始化一个Map拆分器,拆分器对String拆分时,separator为key和value之间的分隔符. | 
| Splitter.MapSplitter | withKeyValueSeparator(String separator)初始化一个Map拆分器,拆分器对String拆分时,separator为key和value之间的分隔符. | 
三、Splitter 介绍
JDK内建的字符串拆分工具有一些古怪的特性。比如 String.split 悄悄丢弃了尾部的分隔符。
问题:",a,,b,".split(","); 在以下返回结果中那个正确?
- "", "a", "", "b", ""
- null, "a", null, "b", null
- "a", null, "b"
- "a", "b"
以上都不对
正确答案是:"", "a", "", "b"。只有尾部的空字符串被忽略了。
而 Splitter 使用令人放心的、直白的流畅API模式对这些混乱的特性作了完全的掌控。
Splitter.on(',')
        .trimResults()
        .omitEmptyStrings()
        .split("foo,bar,,   qux");上述代码返回 Iterable<String>,其中包含 ”foo”、”bar” 和 ”qux”。Splitter可以被设置为按照任何模式、字符、字符串或字符匹配器拆分。
拆分器工厂
| 方法 | 描述 | 范例 | 
|---|---|---|
| Splitter.on(char) | 按单个字符拆分 | Splitter.on(‘;’) | 
| Splitter.on(CharMatcher) | 按字符匹配器拆分 | Splitter.on(CharMatcher.BREAKING_WHITESPACE) | 
| Splitter.on(String) | 按字符串拆分 | Splitter.on(“, “) | 
| Splitter.on(Pattern)Splitter.onPattern(String) | 按正则表达式拆分 | Splitter.onPattern(“\r?\n”) | 
| Splitter.fixedLength(int) | 按固定长度拆分;最后一段可能比给定长度短,但不会为空。 | Splitter.fixedLength(3) | 
如果你想要拆分器返回List,只要使用 Lists.newArrayList(splitter.split(string)) 或类似方法。
注意: splitter 实例总是不可变的。用来定义 splitter 目标语义的配置方法总会返回一个新的splitter实例。这使得 splitter 实例都是线程安全的,你可以将其定义为 static final 常量。
四、测试类
package com.example.guava.string_utilities;
import com.google.common.base.CharMatcher;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import junit.framework.TestCase;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
/**
 * Splitter 测试
 */
public class SplitterTest extends TestCase {
    public void test1() {
        List<String> list = Splitter.on("!").splitToList("hello!world");
        System.out.println(list);   // [hello, world]
    }
    /**
     * 过滤空
     */
    public void test2() {
        List<String> list = Splitter.on("!").omitEmptyStrings().splitToList("hello ! world!!!!!!");
        System.out.println(list.size());    // 2
        System.out.println(list);           // [hello ,  world]
    }
    /**
     * 去空格,过滤空
     */
    public void test3() {
        List<String> list = Splitter.on("!").trimResults().omitEmptyStrings().splitToList("hello ! world!  !!!!!");
        System.out.println(list.size());    // 2
        System.out.println(list);           // [hello ,  world]
    }
    /**
     * 分割限制
     */
    public void test4() {
        List<String> list = Splitter.on("#").limit(3).splitToList("hello#world#java#google#scala");
        System.out.println(list.size());    // 3
        System.out.println(list);           // [hello, world, java#google#scala]
    }
    /**
     * 按长度分割
     */
    public void test5() {
        List<String> list = Splitter.fixedLength(3).splitToList("aaabbbccccddd");
        System.out.println(list.size());    // 5
        System.out.println(list);           // [aaa, bbb, ccc, cdd, d]
    }
    /**
     * 正则匹配
     */
    public void test6() {
        /*通过正则表达式初始化拆分器*/
        String str = "apple.banana,,orange,,.";
        List<String> result = Splitter.onPattern("[.|,]").omitEmptyStrings().trimResults().splitToList(str);
        System.out.println(result);     // [apple, banana, orange]
    }
    /**
     * 正则表达式 + 键值对
     */
    public void test7() {
        Map<String, String> map = Splitter.on(Pattern.compile("\\|"))
                .trimResults()
                .omitEmptyStrings()
                .withKeyValueSeparator("=")
                .split("hello=HELLO| world=WORLD|||");
        System.out.println(map.size()); // 2
        System.out.println(map);        // {hello=HELLO, world=WORLD}
    }
    /**
     * CharMatcher.anyOf
     */
    public void test8() {
        /*通过Char初始化拆分器,将String分隔为Iterable*/
        String str = "this, is  , , random , text,";
        List<String> result = Lists.newArrayList(Splitter.on(',').omitEmptyStrings().trimResults().split(str));
        System.out.println(result);     // [this, is, random, text]
        String str1 = "~?~this, is~~ , , random , text,";
        result = Splitter.on(',').omitEmptyStrings().trimResults(CharMatcher.anyOf("~? ")).splitToList(str1);
        System.out.println(result);     // [this, is, random, text]
    }
}五、相关文章
未经允许请勿转载:程序喵 » Google Guava 快速入门 —— 【字符串处理】Spiltter 拆分器
 程序喵
程序喵