关于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
本文深入介绍了Google Guava库中的Joiner和Splitter工具类,包括它们的功能、用法及应用场景,并提供了丰富的示例代码,旨在帮助读者更高效地处理字符串连接与拆分任务。

834

被折叠的 条评论
为什么被折叠?



