guava翻译系列之Joiner

基本的guava工具

在前面的章节,我们已经讨论了什么是GUAVA和怎样去安装GUAVA,在这一章我们将开始使用guava,我们将展示guava提供的基本功能,并且了解一下这些基本功能是怎样帮助我们简化日常工作遇到的的问题
在这一章节中,我们将覆盖一下几个方面的内容:

  • 使用Joiner Class 将字符串以指定的分隔符连接起来。 我们也会涉及到使用MapJoiner
  • Splitter Class,和Joiner的作用相反,将一个字符串以给定的分隔符分隔开
  • 使用CharMatcher 和 Strings 类 完成一些基本的操作,比如 将String中的一部分移出,匹配String中的某一部分等等
  • Preconditions Class 提供了一些方法去判断参数,方法,变量是否和你的预期一样
  • 可以和任何一个java对象协作的一些基本的工具类,还有以比较方便的方式实现 Comparable 接口

使用Joiner 类

将一些普通的字符串以固定的分隔符组装在一起是我们在平常工作遇到的,比如将一个Array,List,iterable包含的内容组转成字符串,最常见的就是使用循环将字符串拼接在StringBuilder上,一般的代码如下:

这段代码要注意的就是要将最后一个分隔符去掉。这段代码不是很复杂,但是没有什么价值,完全可以使用Joiner类实现。 下面是一个简单的例子,使用Joiner类以 “|” 将字符串分隔:
Joiner.on("|").skipNulls().join(StringList);
这段代码以简洁明明了的方式实现字符串分隔的功能,降低了代码出错的概率。 如果你需要将List中的null值以一个特殊的值代替,那么可以用下面的代码实现:
Joiner.on("|").userForNull(“no value”).join(stringList).

关于Joiner有如下几点我们需要强调:

  • Joiner Class不仅仅和String[]一起工作,还可以和array iterable,以及数组对象,Joiner返回是循环Object.toString()方法。
  • 如果没有使用skipNulls或者userForNull 那么出现Null时,会出现NullPointException
  • Joiner Class是一个不变类,就像String一样
    Joiner stringJoiner = Joiner.on("|").skipNulls();
    //the useForNull() method returns a new instance
    of the Joiner!
    stringJoiner.useForNull("missing");
    stringJoiner.join("foo","bar",null);

    在这个例子中,useForNull这个方法返回了一个新的Joiner对象,对原来的stringJoiner没有任何影响,因此当运行这个例子的时候,最后一个null对象还是会被忽略,不会变成 missing.
  • Joiner 类不仅仅会返回Strings,而且还能返回StringBuilder
    StringBuilder stringBuilder = new StringBuilder();
    Joiner joiner = Joiner.on("|").skipNulls();
    //returns the StringBuilder instance with the values foo,bar,baz
    appeneded with "|" delimiters
    joiner.appendTo(stringBuilder,"foo","bar","baz")

    在这个例子中,我们传递了个一个StringBuilder的实例给Joiner Class,joiner.appedTo 会将 foo,bar,baz 以 “|”分隔,并将值给stringBuilder.
  • Joiner 类可以和实现了Appendable的实例合作
    FileWriter fileWriter = new FileWriter(new File("path")):
    List<Date> dateList = getDates();
    Joiner joiner = Joiner.on("#").useForNulls(" ");
    //returns the FileWriter instance with the values
    appended into it
    joiner.appendTo(fileWriter,dateList);

    这里我们看到了一个和上面类似的例子,我们传递一个FileWriter的实例和一个包含了Date的list给Joiner 类,Joiner 类会将包含日期的list追加到FileWriter实例上。

从上面的例子中我们可以看到,Joiner类在处理一些基本任务是非常容易的,并且非常容易的。 在我们将目光离开Joiner类之前,我们来看一个特殊的类 MapJoiner,MapJoiner的使用方式和Joiner差不多,但是有一点不同的是: 他是将key/value以特地的分隔符分隔,创建一个MapJoiner类可以采用如下方式:
mapJoiner = Joiner.on("#").withKeyValueSeparator("=");
让我们快速的看一下这段代码做了什么事:

  • Joiner.on("#") 创建了一个Joiner 对象
  • withKeyValueSeparator方法创建了一个MapJoiner对象

下面是一个例子展示MapJoiner的使用:
@Test
public void testMapJoiner() {
//Using LinkedHashMap so that the original
order is preserved
String expectedString = "Washington D.C=Redskins#New York
City=Giants#Philadelphia=Eagles#Dallas=Cowboys";
Map<String,String> testMap = Maps.newLinkedHashMap();
testMap.put("Washington D.C","Redskins");
testMap.put("New York City","Giants");
testMap.put("Philadelphia","Eagles");
testMap.put("Dallas","Cowboys");
String returnedString = Joiner.on("#").
withKeyValueSeparator("=").join(testMap);
assertThat(returnedString,is(expectedString));
}

回顾一下Joiner类的使用

前面的单元测试的例子中,我们使用Maps的一个静态工厂类的newLinkedHashMap方法创建了一个LinkedHashMap. 这个方法可以在com.google.common.collect包中找到。 Joiner 类将map中的每个对象以"#"分隔. withKeyValueSeparator 返回MapJoiner类,将map里面的key/value对象以"="分隔。 最后我们使用Assert进行断言。

时间: 2024-11-02 08:18:10

guava翻译系列之Joiner的相关文章

guava翻译系列之Collections

引言 集合对于任何一门语言都是必须的.没有集合我们写不出一些复杂的逻辑.Guava继承扩展了Google Collections的一些功能. 从 com.google.common.collect包下面的类的数量,我们就可以看出Collections的重要性. 虽然已经有了这么多的工具类,但是还是有很多场景我们没有覆盖到,我们希望我们能够覆盖到日常使用的哪些. 下面我们就在每天的编程中经常会使用的类做一下介绍. 这一章节中我们将涉及以下几个方面: lists,maps,sets 等这些包含非常有

guava翻译系列之Cache

Guava Cache 在软件开发的过程,缓存是一个非常重要的话题. 在稍微复杂的开发过程中,我们基本上是不可能不使用到缓存的. 至少我们会使用Map去存储一些东西. 这其实就是一个最简单的缓存. Guava给我们提供了比简单的使用HashMap更强大更灵活的功能,但是和专业的缓存工具相比,(EHCache,Memcached)功能还有些不足, 那么这一章,我们将覆盖Guava cache的下面几个方面: -- 使用MapMaker类创建ConcurrentMap实例 -- 使用CacheBui

Guava翻译系列之File

使用guava处理文件 读写文件是一个程序员的核心能力! 令人意外的事,虽然java有非常丰富的并且强壮的I/O接口,但是却不怎么好用. 虽然在java7中已经有了一些改善. 但是我们还是要学一下guava的I/O相关的工具. 这一章我们要学习一下内容: -- 使用Files类处理文件的移动和复制,或者从文件中读取内容到字符串中 -- Closer 类 给我们提供非常简洁干净的方式去确保文件被正确关闭 -- ByteSource 和 CharSource 类,是inputStream和reade

Guava翻译系列之EventBus

EventBus 类解析 当我们开发软件时,各个对象之间的数据共享和合作是必须的. 但是这里比较难做的是 怎样保证消息之间的传输高效并且减少各个模块之间的耦合. 当组件的职责不清楚时,一个组件还要承担另一个组件的职责,这样的系统我们就认为是高耦合. 当我们的系统变得高耦合时,任何一个小的改动都会对系统造成影响. 为了解决设计上的问题,我们设计了基于事件的设计模型. 在事件驱动编程模型中,对象可以发布/订阅 事件. 事件监听者就是监听事件的发生,我们在第六章中已经看到过RemovalListene

guava翻译系列之Splitter

使用Splitter类 另一个常见的操作就是解析一个以固定分隔符分隔的字符串,并返回一个包含这个String的数组,如果你需要去阅读一个text文件,你会经常要处理这种情况.但是String.split方法还有一些可以改进的地方,就像下面的例子所展示的:String testString = "Monday,Tuesday,,Thursday,Friday,,"; //parts is [Monday, Tuesday, , Thursday,Friday] String[] part

Guava翻译之Functional

使用guava进行函数式编程 在这一章,我们将关注使用guava将我们的开发变得更加容易,我们下面将学习具体的接口和类让我们的程序的扩展性,健壮性更好. 我们这一章里面将覆盖一下几个主题: Function 接口: 介绍怎样在java中使用函数式编程,并且讨论一下函数式编程的最佳实践 Functions 类: Functions 是一个包含了一些实现Function接口的静态方法的集合 Predicate 接口:Predicate 接口是计算一个对象是否满足条件,如果满足条件则返回True pr

Guava翻译之Strings

使用Guava处理Strings 不管你更喜欢使用哪种语言,程序员都必须和字符串打交道,有时候这是无趣的并且容易出错的. 有的时候,我们需要从文件或者数据库的表中读取数据,并格式化这些数据. 或者为了满足业务需求我们需要排序等操作,幸运的是,Guava给我们提供一些非常有用的类,可以帮助我们处理Strings类更加容易.这些类是: CharMatcher Charsets Strings 下面让我们看一下在我们的代码中怎么样是使用这些类. 使用Charsets类 在Java平台下有个6个标准的字

Oracle ASM 翻译系列第八弹:ASM Internal ASM file extent map

当ASM创建一个文件时(例如数据库实例要求创建一个数据文件),它会以extent为单位分配空间.一旦文件被创建,ASM会传递extent映射表给数据库实例,后续数据库实例能在不和ASM实例交互的情况下访问这个文件.如果一个文件的extent需要被重新定位,比如磁盘组进行rebalance操作,ASM会告知数据库实例关于extent映射表的变更. 可以通过查询ASM实例的X$KFFXP视图来获取ASM文件extent映射表的内容.X$KFFXP视图中的每一行对应着所有处于mount状态磁盘组中每一

7.Swift教程翻译系列——控制流之循环

英文版PDF下载地址http://download.csdn.net/detail/tsingheng/7480427 Swift提供了类C语言类似的控制流结构.包括for循环和while循环来多次执行任务,if和switch语句根据不同的条件执行不同的分支代码,break和continue语句将执行流程跳转到其他语句. 除了C里面传统的for-条件-递增循环,Swift还增加了for-in循环使得遍历数组,字典,范围,字符串或者其他序列都很简单. Swift的switch语句也要比C语言的sw