1:guava源码笔记

一:官方教程

网址:http://blog.csdn.net/axi295309066/article/details/53726023

API文档:http://tool.oschina.net/apidocs/apidoc?api=guava

博客:http://ju.outofmemory.cn/entry/67423

博客:http://outofmemory.cn/java/guava/base/Strings

Github地址:https://github.com/google/guava/wiki/CachesExplained

二:Optional优雅的使用null

Optional方法说明和使用实例:

 1.常用静态方法:

  Optional.of(T):获得一个Optional对象,其内部包含了一个非null的T数据类型实例,若T=null,则立刻报错。

  Optional.absent():获得一个Optional对象,其内部包含了空值

  Optional.fromNullable(T):将一个T的实例转换为Optional对象,T的实例可以不为空,也可以为空[Optional.fromNullable(null),和Optional.absent()等价。

 2.实例方法:

  1>. boolean isPresent():如果Optional包含的T实例不为null,则返回true;若T实例为null,返回false

  2>. T get():返回Optional包含的T实例,该T实例必须不为空;否则,对包含null的Optional实例调用get()会抛出一个IllegalStateException异常

  3>. T or(T):若Optional实例中包含了传入的T的相同实例,返回Optional包含的该T实例,否则返回输入的T实例作为默认值

  4>. T orNull():返回Optional实例中包含的非空T实例,如果Optional中包含的是空值,返回null,逆操作是fromNullable()

  5>. Set asSet():返回一个不可修改的Set,该Set中包含Optional实例中包含的所有非空存在的T实例,且在该Set中,每个T实例都是单态,如果Optional中没有非空存在的T实例,返回的将是一个空的不可修改的Set。

三:函数式编程

Guava提供两个基本的函数式接口:

Function,它声明了单个方法B apply(A input)。Function对象通常被预期为引用透明的——没有副作用——并且引用透明性中的”相等”语义与equals一致,如a.equals(b)意味着function.apply(a).equals(function.apply(b))。

Predicate,它声明了单个方法boolean apply(T input)。Predicate对象通常也被预期为无副作用函数,并且”相等”语义与equals一致。

注意:Range类实现了Predicate,用以判断值是否在区间内。

1:断言

注意:断言Predicate的最基本应用就是过滤集合。所有Guava过滤方法都返回”视图”。也就是说:并非用一个新的集合表示过滤,而只是基于原集合的视图。

集合类型过滤方法

IterableIterables.filter(Iterable, Predicate)

FluentIterable.filter(Predicate)

IteratorIterators.filter(Iterator, Predicate)

CollectionCollections2.filter(Collection, Predicate)

SetSets.filter(Set, Predicate)

SortedSetSets.filter(SortedSet, Predicate)

MapMaps.filterKeys(Map, Predicate)

Maps.filterValues(Map, Predicate)

Maps.filterEntries(Map, Predicate)

SortedMapMaps.filterKeys(SortedMap, Predicate)

Maps.filterValues(SortedMap,Predicate)

Maps.filterEntries(SortedMap, Predicate)

MultimapMultimaps.filterKeys(Multimap, Predicate)

Multimaps.filterValues(Multimap, Predicate)

Multimaps.filterEntries(Multimap, Predicate)

另外还有:Guava另外提供了若干用Predicate处理Iterable的工具——通常在Iterables工具类中。

Iterables方法签名说明另请参见

boolean all(Iterable, Predicate)是否所有元素满足断言?懒实现:如果发现有元素不满足,不会继续迭代Iterators.all(Iterator, Predicate)

FluentIterable.allMatch(Predicate)

boolean any(Iterable, Predicate)是否有任意元素满足元素满足断言?懒实现:只会迭代到发现满足的元素Iterators.any(Iterator, Predicate)

FluentIterable.anyMatch(Predicate)

T find(Iterable,Predicate)循环并返回一个满足元素满足断言的元素,如果没有则抛出NoSuchElementExceptionIterators.find(Iterator, Predicate)

Iterables.find(Iterable, Predicate, T default)

Iterators.find(Iterator, Predicate, T default)

Optional tryFind(Iterable, Predicate)返回一个满足元素满足断言的元素,若没有则返回Optional.absent()Iterators.find(Iterator, Predicate)

Iterables.find(Iterable, Predicate, T default)

Iterators.find(Iterator, Predicate, T default)

indexOf(Iterable, Predicate)返回第一个满足元素满足断言的元素索引值,若没有返回-1Iterators.indexOf(Iterator, Predicate)

removeIf(Iterable, Predicate)移除所有满足元素满足断言的元素,实际调用Iterator.remove()方法Iterators.removeIf(Iterator, Predicate)

2:函数

注意:到目前为止,函数最常见的用途为转换集合。同样,所有的Guava转换方法也返回原集合的视图。

集合类型转换方法

IterableIterables.transform(Iterable, Function)

FluentIterable.transform(Function)

IteratorIterators.transform(Iterator, Function)

CollectionCollections2.transform(Collection, Function)

ListLists.transform(List, Function)

Map*Maps.transformValues(Map, Function)

Maps.transformEntries(Map, EntryTransformer)

SortedMap*Maps.transformValues(SortedMap, Function)

Maps.transformEntries(SortedMap, EntryTransformer)

Multimap*Multimaps.transformValues(Multimap, Function)

Multimaps.transformEntries(Multimap, EntryTransformer)

ListMultimap*Multimaps.transformValues(ListMultimap, Function)

Multimaps.transformEntries(ListMultimap, EntryTransformer)

TableTables.transformValues(Table, Function)

*Map和Multimap有特殊的方法,其中有个EntryTransformer参数,它可以使用旧的键值来计算,并且用计算结果替换旧值。

可以组合Function使用的类包括:

OrderingOrdering.onResultOf(Function)

PredicatePredicates.compose(Predicate, Function)

EquivalenceEquivalence.onResultOf(Function)

SupplierSuppliers.compose(Function, Supplier)

FunctionFunctions.compose(Function, Function)

此外,ListenableFuture API支持转换ListenableFuture。Futures也提供了接受AsyncFunction参数的方法。AsyncFunction是Function的变种,它允许异步计算值。

Futures.transform(ListenableFuture, Function)

Futures.transform(ListenableFuture, Function, Executor)

Futures.transform(ListenableFuture, AsyncFunction)

Futures.transform(ListenableFuture, AsyncFunction, Executor)

二:字符串处理:分隔,连接,填充

连接器[Joiner]

用分隔符把字符串序列连接起来也可能会遇上不必要的麻烦。如果字符串序列中含有null,那连接操作会更难。Fluent风格的Joiner让连接字符串更简单。

Joiner joiner = Joiner.on("; ").skipNulls();return joiner.join("Harry", null, "Ron", "Hermione");

上述代码返回”Harry; Ron; Hermione”。另外,useForNull(String)方法可以给定某个字符串来替换null,而不像skipNulls()方法是直接忽略null。 Joiner也可以用来连接对象类型,在这种情况下,它会把对象的toString()值连接起来。

Joiner.on(",").join(Arrays.asList(1, 5, 7)); // returns "1,5,7"

警告:joiner实例总是不可变的。用来定义joiner目标语义的配置方法总会返回一个新的joiner实例。这使得joiner实例都是线程安全的,你可以将其定义为static final常量。

拆分器[Splitter]

JDK内建的字符串拆分工具有一些古怪的特性。比如,String.split悄悄丢弃了尾部的分隔符。

拆分器工厂

方法描述范例

Splitter.on(char)按单个字符拆分Splitter.on(‘;’)

Splitter.on(CharMatcher)按字符匹配器拆分Splitter.on(CharMatcher.BREAKING_WHITESPACE)

Splitter.on(String)按字符串拆分Splitter.on(“,   “)

Splitter.on(Pattern)Splitter.onPattern(String)按正则表达式拆分Splitter.onPattern(“\r?\n”)

Splitter.fixedLength(int)按固定长度拆分;最后一段可能比给定长度短,但不会为空。Splitter.fixedLength(3)

拆分器修饰符

方法描述

omitEmptyStrings()从结果中自动忽略空字符串

trimResults()移除结果字符串的前导空白和尾部空白

trimResults(CharMatcher)给定匹配器,移除结果字符串的前导匹配字符和尾部匹配字符

limit(int)限制拆分出的字符串数量

字符集[Charsets]

bytes=string.getBytes(Charsets.UTF_8);

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容