源码阅读之Splitter

重点关注

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));

猜你喜欢

转载自blog.csdn.net/w535921917/article/details/84930126