分享好友 最新动态首页 最新动态分类 切换频道
Guava(瓜娃)学习笔记
2024-12-26 22:51

Guava工程包含了若干被google的java项目广泛依赖的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [commonannotations] 、字符串处理 [string processing] 、I/O 等等。所有这些工具每天都在被Google的工程师应用在产品服务中。

这些高质量的API可以使你的java代码更加优雅,更加简洁,让你的工作更加轻松愉悦,下面我们来开启Java编程学习之旅。

源码包的简单说明:

com.google.common.annotations:普通注解类型。

com.google.common.base:基本工具类库和接口。

com.google.common.cache:缓存工具包,非常简单易用且功能强大的JVM内缓存。

com.google.common.collect:带泛型的集合接口扩展和实现,以及工具类,这里你会发现很多好玩的集合。

com.google.common.eventbus:发布订阅风格的事件总线。

com.google.common.hash: 哈希工具包。

com.google.common.io:I/O工具包。

com.google.common.math:原始算术类型和超大数的运算工具包。

com.google.common.net:网络工具包。

com.google.common.primitives:八种原始类型和无符号类型的静态工具包。

com.google.common.reflect:反射工具包。

com.google.common.util.concurrent:多线程工具包。

1)    使用和避免null(Optional)

null会引起歧义,会造成让人迷惑的错误,有时也会让人感到不爽。Guava中的许多工具遇到null时,会拒绝或者马上报错,而不是盲目的接受。

鉴于此google的guava库中提供了Optional接口来使null快速失败,即在可能为null的对象上做了一层封装,在使用Optional静态方法of时,如果传入的参数为null就抛出NullPointerException异常。

在Guava中Optional类就是用来强制提醒程序员,注意对Null的判断。

Optional的另外几个方法

Optional<T>.of(T)    为Optional赋值,当T为Null直接抛NullPointException,建议这个方法在调用的时候直接传常量,不要传变量

Optional<T>.fromNullable(T)  为Optional赋值,当T为Null则使用默认值。建议与or方法一起用,风骚无比

Optional<T>.absent()       为Optional赋值,采用默认值

T or(T)      当Optional的值为null时,使用or赋予的值返回。与fromNullable是一对好基友

T get()      当Optional的值为null时,抛出IllegalStateException,返回Optional的值

boolean isPresent() 如果Optional存在值,则返回True

T orNull() 当Optional的值为null时,则返回Null。否则返回Optional的值

Set<T> asSet() 将Optional中的值转为一个Set返回,当然只有一个值啦,或者为空,当值为null时。

使用Optional的意义?

使用Optional除了赋予null语义,增加了可读性,最大的优点在于它一种傻瓜式的防护,Optional迫使你积极思考引用缺失的情况,因为你必须显式地从Optional获取引用。直接使用null很容易让人忘掉某些情形,尽管FindBugs可以帮助查找null相关的问题,但是我们还是认为它并不能准确地定位问题根源。

2)    前提条件(Preconditions)

使方法的条件检查更简单。

Guava在Preconditions类中提供了若干前置条件判断的实用方法,我们强烈建议在Eclipse中静态导入这些方法。每个方法都有三个变种:

a)        没有额外参数:抛出的异常中没有错误消息;

b)        有一个Object对象作为额外参数:抛出的异常使用Object.toString() 作为错误消息;

c)        有一个String对象作为额外参数,并且有一组任意数量的附加Object对象:这个变种处理异常消息的方式有点类似printf,但考虑GWT的兼容性和效率,只支持%s指示符。

例如:查看源代码打印帮助

checkArgument(i>= 0, "Argument was %s but expected nonnegative", i);

checkArgument(i< j, "Expected i < j, but %s > %s", i, j);

方法声明(不包括额外参数)

描述

检查失败时抛出的异常

checkArgument(boolean)

检查boolean是否为true,用来检查传递给方法的参数。

IllegalArgumentException

checkNotNull(T)

检查value是否为null,该方法直接返回value,因此可以内嵌使用checkNotNull

NullPointerException

checkState(boolean)

用来检查对象的某些状态。

IllegalStateException

checkElementIndex(int index, int size)

检查index作为索引值对某个列表、字符串或数组是否有效。index>=0 && index<size *

IndexOutOfBoundsException

checkPositionIndex(int index, int size)

检查index作为位置值对某个列表、字符串或数组是否有效。index>=0 && index<=size *

IndexOutOfBoundsException

checkPositionIndexes(int start, int end, int size)

检查[start, end]表示的位置范围对某个列表、字符串或数组是否有效*

IndexOutOfBoundsException

 

3)    常见的对象方法(Objects)

简化Object方法实现,如hashCode()和toString();

a)        equals

当一个对象中的字段可以为null时,实现Object.equals方法会很痛苦,因为不得不分别对它们进行null检查。使用Objects.equal帮助你执行null敏感的equals判断,从而避免抛出NullPointerException。

b)        hashCode

用对象的所有字段作散列[hash]运算应当更简单。Guava的Objects.hashCode(Object...)会对传入的字段序列计算出合理的、顺序敏感的散列值。你可以使用Objects.hashCode(field1, field2, …, fieldn)来代替手动计算散列值。

c)        toString

好的toString方法在调试时是无价之宝,但是编写toString方法有时候却很痛苦。使用 Objects.toStringHelper可以轻松编写有用的toString方法。

4)    排序

Guava强大的”流畅风格比较器”,具体到下章会介绍到。

5)    Throwable类

简化了异常和错误的传播与检查;

guava类库中的Throwables提供了一些异常处理的静态方法,这些方法的从功能上分为两类,一类是帮你抛出异常,另外一类是帮你处理异常。

RuntimeException   propagate(Throwable)

如果Throwable是Error或RuntimeException,直接抛出;否则把Throwable包装成RuntimeException抛出。返回类型是RuntimeException,所以你可以像上面说的那样写成throw Throwables.propagate(t),Java编译器会意识到这行代码保证抛出异常。

void propagateIfInstanceOf( Throwable, Class<X extends   Exception>) throws X

Throwable类型为X才抛出

void propagateIfPossible( Throwable)

Throwable类型为Error或RuntimeException才抛出

void   propagateIfPossible( Throwable, Class<X extends Throwable>) throws X

Throwable类型为X, Error或RuntimeException才抛出

 

介绍guava对jdk集合类的扩展,包括不可变集合,新集合类型: multisets, multimaps, tables, bidirectional maps等,强大的集合工具类: 提供java.util.Collections中没有的集合工具,扩展工具类:让实现和扩展集合类变得更容易,比如创建Collection的装饰器,或实现迭代器

集合API的使用, 可以简化集合的创建和初始化;

guava API 提供了有用的新的集合类型,协同已经存在的java集合工作的很好。

分别是 MultiMap, MultiSet, Table, BiMap,ClassToInstanceMap

1)    google guava的不可变集合

不可变对象有很多优点:

a)        当对象被不可信的库调用时,不可变形式是安全的。

b)        当不可变对象被对个线程调用时,不存在竞态条件问题;

c)        不可变集合不需要考虑变化,因此可以节约时间和空间,所有不可变集合都比可变集合形式有更好的内存利用率(分析和测试细节);

d)        不可变对象因为有固定不变,可以用作常量来安全使用。

总结:数据不可变;不需要同步逻辑;线程安全;自由共享;容易设计和实现;内存和时间高效

创建对象的不可拷贝是一项很好的防御性编程技巧,Guava为所有JDK标准集合类型和Guava新集合类型都提供了简单易用的不可变版本。

 

JDK也提供了可以将集合变成不可变的方法,Collections.unmodifiableXXX,但是被认为是不好的。

a)        笨重而且累赘:不能舒适地用在所有想做防御性拷贝的场景;

b)        不安全:要保证没人通过原集合的引用进行修改,返回的集合才是事实上不可变的;

c)        低效:包装过的集合仍然保有可变集合的开销,比如并发修改的检查、散列表的额外空间,等等。

最新文章
笔记本电脑功率详解:影响因素、计算方式与应用场景
一、笔记本电脑功率概述笔记本电脑功率是指笔记本在运行过程中所需的能量,通常以瓦(W)为单位表示。功率是影响笔记本电脑性能的重要因素之一,了解笔记本功率可以帮助我们更好地选择适合自己需求的电脑。二、影响笔记本电脑功率的因素1.
运营干货|| 亚马逊广告关键词匹配方式及使用场景,让你的流量更精准 Keyboards 2
一谈到广告,关键词就是一个绕不开的话题,也是我们在广告运营中的重中之重。所以,我打算将亚马逊上关键词的内容,分成8篇的更新,从0-1带你全方位的了解亚马逊关键词的基础概念到高阶运营中的用法。在之前的文章中已经更新了亚马逊关键词
郑州企业专属网络名片定制专家,助力品牌飞跃
郑州专业网站搭建团队,专注于为企业量身定制专属网络名片,助力品牌形象提升与市场拓展,推动企业腾飞。郑州专业网站搭建团队的核心优势挑选郑州专业网站搭建团队的策略塑造企业独特的网络形象在互联网迅猛发展的今天,网络营销日益成为企
教你如何获取root权限认识ROOT怎么使用教程(图)
手机越用越智能,而系统定制又包含较多无用的应用,对于玩机爱好者来说,这是多么多么郁闷的一件事;更为重要的是,高玩们更喜欢DIY,喜欢那种控制的快感!所以今天就给大家说说Android手机ROOT权限的获取(iOS的越狱、塞班的xx、Meego的RO
郑州电子中专学校专业介绍 学费多少 2024招生简章
在当今信息技术日新月异的时代,职业教育成为连接梦想与现实的桥梁。郑州电子中专学校,作为一所集专业技能培训与理论知识传授于一体的优秀中等专业学校,致力于培养适应市场需求的高素质技能型人才。本文将详细介绍郑州电子中专学校的专业
股票行情快报:华测导航(300627)12月12日主力资金净卖出2432.67万元
证券之星消息,截至2024年12月12日收盘,华测导航(300627)报收于42.01元,下跌0.4%,换手率2.29%,成交量10.38万手,成交额4.35亿元。12月12日的资金流向数据方面,主力资金净流出2432.67万元,占总成交额5.59%,游资资金净流入2430.27万元
白小姐三肖三期必出一期开奖虎年,深度策略应用数据_4K版15.974
白小姐三肖三期必出一期开奖虎年,这一深度策略应用数据_4K版15.974的预测模型,近年来在彩票界引起了广泛关注。该模型以其独特的算法和数据分析能力,为彩民提供了一种全新的彩票预测方式。本文将深入探讨这一模型的工作原理、优势以及其
江苏企业互联网营销新起点,百度优化推广实战教程
江苏百度优化推广教程,专为助力企业互联网营销新起点设计。本教程深入解析百度推广策略,涵盖关键词优化、广告创意、数据分析等关键环节,助您快速提升企业网络曝光度,精准触达潜在客户,实现营销目标。随着互联网的快速发展,越来越多的
如何在微信中高效转发聊天记录及注意事项总结
微信怎么转发聊天记录How to Forward Chat History on WeChat  在当今数字化时代,社交软件已经成为我们日常生活中不可或缺的一部分。微信作为中国最流行的通讯工具之一,不仅可以进行文字聊天、语音通话,还支持图片、视频、文件等多种
海外短视频软件,分享生活瞬间的热门应用
在这个数字化的时代,短视频已经成为了人们分享生活瞬间的热门方式。海外短视频软件更是让用户可以与全球的人分享自己的生活点滴,让生活变得更加有趣和有意义。如果你还没有尝试过使用海外短视频软件,那么介绍一些值得一试的应用,以及如
相关文章
推荐文章
发表评论
0评