Google Guava 快速入门 —— 【字符串处理】Spiltter 拆分器

Google Guava 快速入门.jpg

Guava Spiltter —— 拆分器

Splitter 提供了各种方法来处理分割操作字符串,对象等。

一、类声明

以下是 com.google.common.base.Splitter 类的声明:

@GwtCompatible(emulated=true)
public final class Splitter
    extends Object

二、类方法

修饰符和类型方法说明
static SplitterfixedLength(int length) 
初始化拆分器,拆分器会将字符串分割为元素长度固定的List,最后一个元素长度不足可以直接返回.
Splitterlimit(int limit) 
限制拆分出的字符串数量
SplitteromitEmptyStrings() 
从结果中自动忽略空字符串.
static Splitteron(char separator) 
初始化拆分器,参数为分隔符.
static Splitteron(CharMatcher separatorMatcher) 
初始化拆分器,参数为分隔符.
static Splitteron(Pattern separatorPattern) 
初始化拆分器,参数为分隔符.
static Splitteron(String separator) 
初始化拆分器,参数为分隔符.
static SplitteronPattern(String separatorPattern) 
返回一个拆分器,它将与给定模式(正则表达式)匹配的任何子序列视为分隔符.
Iterable<String>split(CharSequence sequence) 
对Stirng通过拆分器进行拆分,返回一个Iterable.
List<String>splitToList(CharSequence sequence) 
将序列拆分为字符串组件并将其作为不可变列表返回.
SplittertrimResults() 
修饰拆分器,拆分器做拆分操作时,会对拆分的元素做trim操作(删除元素头和尾的空格),相当于 trimResults(CharMatcher.whitespace()).
SplittertrimResults(CharMatcher trimmer) 
修饰拆分器,拆分器做拆分操作时,会删除元素头尾charMatcher匹配到的字符.
Splitter.MapSplitterwithKeyValueSeparator(char separator) 
初始化一个Map拆分器,拆分器对String拆分时,separator为key和value之间的分隔符.
Splitter.MapSplitterwithKeyValueSeparator(Splitter keyValueSplitter) 
初始化一个Map拆分器,拆分器对String拆分时,separator为key和value之间的分隔符.
Splitter.MapSplitterwithKeyValueSeparator(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 拆分器

点  赞 (0) 打  赏
分享到: