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

关于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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值