重点关注
Strategy模式, split返回的Iterable[遍历时才进行split]
其中的AbstractIterator类会常用到
策略模式(Strategy):策略模式定义了一系列的算法,并将每一个算法封装起来,使每个算法可以相互替代,使算法本身和使用算法的客户端分割开来,相互独立。
Splitter 是guava 字符串分割的一个工具类。
Splitter 是immutable的。
先举个栗子:
final Iterable<String> splitStrs = Splitter.on(',').trimResults().split("1 , 0 0 ,2, , ,8"); List<String> splitList1 = Lists.newArrayList(splitStrs); splitList1.stream().forEach(LOGGER::info); LOGGER.info("--------------"); List<String> splitList2 = Splitter.on(',').trimResults().splitToList("1,0,2,,,8"); splitList2.stream().forEach(LOGGER::info); LOGGER.info("--------------"); List<String> splitList3 = Splitter.on(',').trimResults().omitEmptyStrings().splitToList("1,0,2,,,8"); splitList3.stream().forEach(LOGGER::info);
写这个Demo的过程自己对trimResult()方法产生了疑问,自己理解成了,把结果集中的空串去掉,结果怎么都得不到想要的结果,
结果发现是把结果集中的每个结果 调用trim()方法,去掉前后空格。
继续学习,发现去掉结果集中空串的方法是 omitEmptyStrings()
Splitter中的抽象类 SplittingIterator 继承了 AbstractIterator
AbstractIterator
实现了迭代器最重要的两个方法,hasNext
和 next
。
hasNext
很容易理解,一上来先判断迭代器当前状态,如果已经结束,就返回 false
;如果已经找到下一个元素,就返回 true
,不然就试着找找下一个元素。
next 则是先判断是否还有下一个元素,属于防御式编程,先对自己做保护;然后把状态复原到还没找到下一个元素,然后返回结果。至于为什么要把 next 置为 null,可能是帮助 JVM 回收对象。
tryToComputeNext 可以认为是对模板方法 computeNext 的包装调用,首先把状态置为失败,然后才调用 computeNext。这样一来,如果计算下一个元素的过程中发生 RuntimeException,整个迭代器的状态就是 State.FAILED,一旦收到任何调用都会抛出异常。
再列举几个不是特别常用的方法;
public static Splitter fixedLength(final int length)
将字符串分割成指定长度的片段
public Splitter limit(int limit)
分割字符串达到limit数之后停止。(前limit个是按照指定字符分割,最后一个是分割剩下的串)
public Splitter trimResults(CharMatcher trimmer)
从每个返回的子字符串中删除与给定的CharMatcher匹配的所有前导或尾随字符。
public Splitter.MapSplitter withKeyValueSeparator(String separator)
通过指定String分解成entries,然后再通过entry中的特定字符分隔成key-value形式的Map.
举个例子方便理解:
String demo="张三-24/李四-25/王五-26"; Map<String,String> map=Splitter.on('/').withKeyValueSeparator('-').split(demo); map.forEach((key,value) -> LOGGER.info("{} - {}",key,value));