Google Guava学习计划第一章Guava Utilities—Joiner and Splitter

来源:互联网 发布:贴吧云签到源码 编辑:程序博客网 时间:2024/05/16 07:18

关于Google Guava在从多线程ListenableFuture 开始对其充满好感。Java代码写久了,总想着怎么去优雅和简洁,自己也接触过一段时间的scala,函数式风格确实让我十分喜欢,但是工作大部分还是Java。所以考虑通过google guava和Java1.8(stream,Function),1.9新特性从实用性和优雅上可以满足下自己。

立一个Flag,在2018-2月之前学完Guava(基于版本23.0)计划

计划表如下,对应的CSDN博客也会不断更新。希望和大家一起进步。


今天介绍的Joiner和Splitter

Joiner:google 实现的类似Apache Commons中的字符串拼接的工具类,输入多样化。输入: List  Array Map 等 而且支持emptyFilter,JoinWithDefalutValue,appendToFile,stringBUffer等

Splitter:google 实现的类似Apache Commons中的字符串拆解的工具类。解析过程中含有比较使用等功能

fixedLength(3) trimResults() omitEmptyStrings() limit() withKeyValueSeparator()结成返回迭代器或者Map等 

下面等具体Demo 采用maven 方式来演示




JoinerTest 大部分采用Joiner来实现,也有一部分java1.8的stream方式。


package Utilities;import com.google.common.base.Joiner;import com.google.common.io.Files;import com.google.common.primitives.ImmutableIntArray;import org.junit.Test;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.util.Arrays;import java.util.List;import java.util.Map;import static com.google.common.collect.ImmutableMap.of;import static java.util.stream.Collectors.joining;import static org.hamcrest.CoreMatchers.sameInstance;import static org.hamcrest.core.IsEqual.equalTo;import static org.junit.Assert.assertThat;import static org.junit.Assert.fail;/** *{@link List} *  * @author  mengxp * @date   2017-12-10 * @version 1.0 * */public class JoinerTest {    private final List<String> stringList=Arrays.asList(            "Google","Guava","Java","Scala","Kafka"    );    private final String[] stringArray= new String[]{"Jone","JK","Love"};    private final List<String> stringListWithNullValue=Arrays.asList(            "Google","Guava","Java","Scala",null    );    private final String targetFileName="H:\\project\\GoogleGuava\\src\\main\\joiner_file.txt";    private final Map<String,String>  stringMap= of("key1","value1","key2","value2");    @Test    public void testJoinOnJoin(){        //String join = Joiner.on("#").join(stringListWithNullValue);        String join = Joiner.on("#").join(stringList);        assertThat(join,equalTo("Google#Guava#Java#Scala#Kafka"));    }    @Test    public void testJoinOnJoinArray(){        //String join = Joiner.on("#").join(stringListWithNullValue);        String join = Joiner.on("#").join(stringArray);        assertThat(join,equalTo("Google#Guava#Java#Scala#Kafka"));    }    @Test    public void testJoinOnJoinWithNullValue(){        String join = Joiner.on("#").skipNulls().join(stringListWithNullValue);        assertThat(join,equalTo("Google#Guava#Java#Scala"));    }    @Test    public void testJoinOnJoinWithDefaultValue(){        String join = Joiner.on("#").useForNull("MMMM").join(stringListWithNullValue);        assertThat(join,equalTo("Google#Guava#Java#Scala#MMMM"));    }    @Test    public void testJoinOnAppendTo_StringBuffer(){        final StringBuilder builder=new StringBuilder();        StringBuilder resultbuild = Joiner.on("#").useForNull("MMMM").appendTo(builder, stringListWithNullValue);        assertThat(resultbuild,sameInstance(builder));        assertThat(resultbuild.toString(),equalTo("Google#Guava#Java#Scala#MMMM"));    }    @Test    public void testJoinOnAppendTo_Writer(){     try(FileWriter fileWriter=new FileWriter(new File(targetFileName))){         Joiner.on("#").useForNull("MMMM").appendTo(fileWriter,stringListWithNullValue);         assertThat(Files.isFile().test(new File(targetFileName)),equalTo(true));     } catch (IOException e) {         fail();     }    }    //采用JDK1.8的来实现    //Predicate Consumer Function都是java 8的新接口    //Steam中Supplier:供应商    //Stream:高特性的流迭代器    //String::contact    //Intermediate:中间的(流的过滤等,每个操作会返回新的流)    Terminal:末端终点(执行完这类操作后 stream不能被使用了)   Short-circuiting:短回路的    @Test    public void testJoinByStream(){        String collect = stringListWithNullValue.stream().filter(item -> item != null&&!item.isEmpty()).collect(joining("#"));        assertThat(collect,equalTo("Google#Guava#Java#Scala#"));    }    @Test    public void testJoinByStreamUserDefalutValue(){        String collect = stringListWithNullValue.stream()                .map(item -> item != null&&!item.isEmpty()? item:"DEFALUT")                .collect(joining("#"));        assertThat(collect,equalTo("Google#Guava#Java#Scala#"));    }    //其中this::defalutValue 代表这方法的引用    @Test    public void testJoinByStreamUserDefalutValueUseOtherDisplay(){        String collect = stringListWithNullValue.stream()                .map(this::defalutValue)                .collect(joining("#"));        assertThat(collect,equalTo("Google#Guava#Java#Scala#"));    }    private String defalutValue(final String item){        return item != null&&!item.isEmpty()? item:"DEFALUT";    }    //对map的操作    @Test    public void testJoinerToMap(){        String join = Joiner.on(",").withKeyValueSeparator("=").join(stringMap);        assertThat("xx",equalTo(join));    }}


Splitter和JoinerTest功能刚好相反

package Utilities;import com.google.common.base.Splitter;import org.junit.Test;import java.util.List;import java.util.Map;import java.util.regex.Pattern;import static org.hamcrest.CoreMatchers.equalTo;import static org.junit.Assert.assertThat;/** * @author  mengxp * @date   2017-12-10 * @version 1.0 */public class SpliterTest {    /**     * 封装成集合 trimResults将结果进行trim  omitEmptyStrings 忽略空值     */    @Test    public void testSplitOnSplit() {        List<String> result = Splitter.on("|").trimResults().omitEmptyStrings().splitToList("hell0 | world||u|need|java||");        assertThat(result.size(), equalTo(5));    }    /**     * 将字符串aaabbbcccddd 按照3个长度进行分割     */    @Test    public void testSplitFixlength() {        List<String> result = Splitter.fixedLength(3).trimResults().omitEmptyStrings().splitToList("aaabbbcccddd");        assertThat(result.size(), equalTo(4));        System.out.println(result);    }    /**     * action: 当 Splitter.on("|").limit(3) 逐渐的ccc|ddd会作为一个元素     * aaa|bbb|ccc|ddd  ==》[aaa, bbb, ccc|ddd]     */    @Test    public void testSplit() {        List<String> result = Splitter.on("|").limit(3).trimResults().omitEmptyStrings().splitToList("aaa|bbb|ccc|ddd");        assertThat(result.size(), equalTo(3));        System.out.println(result);    }    /**     * 支持正则表达式字符串和Pattern     */    @Test    public void testSplitOnPatternString() {        List<String> result = Splitter.onPattern("\\|").limit(3).trimResults().omitEmptyStrings().splitToList("aaa|bbb|ccc|ddd");        assertThat(result.size(), equalTo(3));        System.out.println(result);    }    /**     * 支持pattern的正则表达式。     */    @Test    public void testSplitOnPattern() {        List<String> result = Splitter.on(Pattern.compile("\\|")).limit(3).trimResults().omitEmptyStrings().splitToList("aaa|bbb|ccc|ddd");        assertThat(result.size(), equalTo(3));        System.out.println(result);    }    /**     * SplitToMap     */    @Test    public void testSplitOnToMap(){        Map<String, String> map = Splitter.on(Pattern.compile("\\|")).trimResults().omitEmptyStrings().withKeyValueSeparator("=").split("key1=V1||||key2=V2");        assertThat(map.size(), equalTo(2));        System.out.println(map);    }}

如果项目中刚好可以用上,希望对大家有帮助。


下一篇 会是函数式的Preconditions&Objects&assert