工具类-part1
Joiner:拼接字符串
Splitter:拆分字符串
Preconditions:断言工具
Joiner
类路径:com.google.common.base.Joiner
用分隔符将一系列字符串连接在一起可能会不必要地复杂——但不应该如此。如果您的序列包含空值,则会更加困难。流式风格使其变得简单。
join()方法
下面以代码来演示。
public class JoinerTest {
private final List<String> strList = Arrays.asList("google", "guava", "java");
private final List<String> strListWithNull = Arrays.asList("google", "guava", "java", null);
@Test
public void joinOnjoin() {
String join = Joiner.on("#").join(strList); // google#guava#java
join = Joiner.on("#").join(strListWithNull); // 报错
join = Joiner.on("#").skipNulls().join(strListWithNull); // google#guava#java
join = Joiner.on("#").useForNull("null").join(strListWithNull); // google#guava#java#null
}
}
appendTo()方法
private final List<String> strList = Arrays.asList("google", "guava", "java");
@Test
public void joinAppendTo() {
StringBuilder sb = new StringBuilder("sb");
// 虽然下方方法会返回一个新对象,但和原来的是同一个对象。
StringBuilder stringBuilder = Joiner.on("#").appendTo(sb, strList);// sbgoogle#guava#java
// 通过流,输出到文件中。
try(FileWriter writer = new FileWriter(new File(targetFileName))) {
Joiner.on("#").useForNull("default").appendTo(writer, strListWithNull);
} catch (IOException e) {
fail("error");
}
}
用JavaSE api实现join()
@Test
public void joinByStream() {
String s1 = strListWithNull.stream().filter(Objects::nonNull).collect(Collectors.joining("#"));
String s2 = Joiner.on("#").skipNulls().join(strListWithNull);
Assert.assertEquals(s1, s2);
}
join map
@Test
public void joinOnWithMap() {
Map<String, String> map = ImmutableMap.of("hello", "zs", "hello1", "ls");
String join = Joiner.on('#').withKeyValueSeparator("=").join(map);
System.out.println(join); // hello=zs#hello1=ls
}
线程安全
Joiner实例总是不可变的。joiner配置方法将始终返回一个新的joiner,您必须使用它来获得所需的语义。这使得任何Joiner线程都是安全的,并且可用作静态final常量。
其他
- java.lang.Appendable:
appendTo()
方法的第一个参数是Appendable
的实现类。它的实现类主要包括各种流,及StringBuilder
、StringBuffer
等。
Splitter
类路径:com.google.common.base.Splitter
用来拆分字符串的工具。Java内置的拆分方法有一些奇怪的行为。例如,
String.split
会丢弃尾部的分隔符。如
",a,,b,".split(",")
,返回值是"", "a", "", "b"
。首部会有一个空串,但尾部不会。
split...()方法
@Test
public void testSplitter1() {
List<String> split1 = Splitter.on("|").splitToList("|hello|world|||"); // [, hello, world, , , ] hello前有一个空格,是因为Splitter内重写了这个返回的list的toString方法。
System.out.println(split1.size()); // 6
split1 = Splitter.on("|").trimResults().omitEmptyStrings().splitToList("| hello |world|||"); // [hello, world]
System.out.println(split1.size()); // 2
List<String> list = Splitter.fixedLength(3).splitToList("aaaBBBcccDDD");
System.out.println(list); // [aaa, BBB, ccc, DDD]。每3个元素一份
list = Splitter.on('#').limit(3).splitToList("hello#world#java#haha#zhangsan#lisi");
System.out.println(list); // [hello, world, java#haha#zhangsan#lisi]。以#拆分,最多拆成3个元素。
}
相关信息
Splitter
同时还支持正则。
todo:
Preconditions 断言
机翻的介绍
Guava在Preconditions
类中提供了许多先决条件检查实用程序。我们强烈建议静态导入这些。 每个方法有三种变体:
没有额外的参数。任何抛出的异常都没有异常消息。
一个额外的
Object
参数。任何抛出的异常都有错误消息object.toString()
。一个额外的
String
参数,任意数量的Object
参数。这类似于printf
,但为了GWT
兼容性和效率,它只允许%s
指示器。注意:
checkNotNull
、checkArgument
和checkState
有大量的重载方法,它们采用了基本数据类型和Object
参数的组合,而不是参数数组——这允许您在绝大多数情况下避免了基本数据类型的装箱和参数数组的分配。
基本用法
@Test
public void testPreconditions() {
List<String> list = null;
// Preconditions.checkNotNull(list); // java.lang.NullPointerException
// Preconditions.checkNotNull(list, "list不能为null"); // java.lang.NullPointerException: list不能为null
// Preconditions.checkNotNull(list, "list不能为null, 且长度必须是%s", 2); // java.lang.NullPointerException: list不能为null, 且长度必须是2
String arg = "a";
Preconditions.checkArgument(arg.equals("b"), "参数错误"); // java.lang.IllegalArgumentException: 参数错误
}
在项目中用的不多。一般都会自定义断言工具类,来指定抛出的异常类型,最后通过统一异常处理。
- 0很棒
- 0不错
- 0一般
- 0???