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