1、Guava 是一组来自 Google 的核心 Java 库,包括新的集合类型(如 multimap 和 multiset)、不可变集合、图形库以及用于并发、I/O、散列、缓存、原语、字符串等的实用程序!被广泛应用于 Google 的大多数 Java 项目中,也被许多其他公司广泛使用。
2、guava github 开源地址:GitHub - google/guava:
3、官网用户手册
4、com.google.guava 依赖:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>29.0-jre</version>
</dependency>
1、制作对象的不可变副本是一种很好的防御性编程技术,不可变对象有许多优点,包括:
2、要点:每个 Guava 不可变集合实现都拒绝 null 值。Guava 的设计上推荐使用 null 值,大多数情况下,遇到 null 值会抛异常.
3、一个不可变的 ImmutableXxx 集合可以通过以下几种方式创建:
ImmutableSet.copyOf(set)ImmutableSet.of("a", "b", "c") 或 ImmutableMap.of("a", 1, "b", 2)4、Guava 为 java jdk 每种标准集合类型提供了简单易用的不可变版本,包括 Guava 自己的集合变体,为 java 提供的不可变版本都是继承 java jdk 的接口而来,所以操作上基本无异。下面接口的实现类也都有对应的不可变版本。
| 接口 | JDK 或者 Guava | 不可变版本 |
|---|---|---|
| Collection | JDK | ImmutableCollection |
| List | JDK | ImmutableList |
| Set | JDK | ImmutableSet |
| SortedSet/NavigableSet | JDK | ImmutableSortedSet |
| Map | JDK | ImmutableMap |
| SortedMap | JDK | ImmutableSortedMap |
| Multiset | Guava | ImmutableMultiset |
| SortedMultiset | Guava | ImmutableSortedMultiset |
| Multimap | Guava | ImmutableMultimap |
| ListMultimap | Guava | ImmutableListMultimap |
| SetMultimap | Guava | ImmutableSetMultimap |
| BiMap | Guava | ImmutableBiMap |
| ClassToInstanceMap | Guava | ImmutableClassToInstanceMap |
| Table | Guava | ImmutableTable |
在线演示源码:
https://github.com/main/java/com/wmx/guava/ImmutableCollectionTest.java
官网文档
https://github.com/google/guava/wiki/ImmutableCollectionsExplained
推荐一个 Spring Boot 基础教程及实战示例:
1、Guava 引入了许多新的集合类型,这些类型不在 Java JDK 中,但却非常有用,这些都是为了与 JDK 集合框架愉快地共存而设计的,而不是将东西塞进 JDK 集合抽象中。
1、Guava 提供了一个新的集合类型 Multiset,它支持添加多个相同的元素,其中成员可以出现不止一次。
2、Multiset 相当于 Set,区别在于 Multiset 可添加相同的元素,它的内部使用一个 HashMap 来维护,
3、Multiset 也有自己的实现类,常用的有 HashMultiset、LinkedHashMultiset、TreeMultiset 等,HashMultiset 、TreeMultiset 是无序的,LinkedHashMultiset 是有序的,操作完全同理 JDK 的 HashSet、TreeSet、LinkedHashSet。
在线演示源码
1、每个有经验的 Java 程序员都曾在某个地方实现过 Map<K、List<V>> 或 Map<K、Set<V>>,Guava 的 Multimap 框架使处理从键到多个值的映射变得容易,多重映射是将键与任意多个值关联的一种通用方法。
2、从概念上讲,有两种方法可以将多重映射视为从单个键到单个值的映射的集合:

3、Multimap 提供了多种实现:
| Multimap | 实现 key 使用的是 | value 使用的是 |
|---|---|---|
| ArrayListMultimap | HashMap | ArrayList |
| HashMultimap | HashMap | HashSet |
| LinkedListMultimap * | LinkedHashMap* | LinkedList* |
| LinkedHashMultimap** | LinkedHashMap | LinkedHashSet |
| TreeMultimap | TreeMap | TreeSet |
| ImmutableListMultimap | ImmutableMap | ImmutableList |
| ImmutableSetMultimap | ImmutableMap | ImmutableSet |
4、除了不可变的实现之外,每个实现都支持空键和值。并不是所有的实现都是作为一个Map<K,Collection<V>>实现的(特别是一些Multimap实现使用自定义哈希表来最小化开销。)
在线演示源码
推荐一个 Spring Boot 基础教程及实战示例:
1、将值映射回键的传统方法是维护两个独立的映射,并使它们保持同步,但这很容易产生错误,并且当映射中已经存在一个值
Map<String, Integer> nameToId = Maps.newHashMap();
Map<Integer, String> idToName = Maps.newHashMap();
nameToId.put("Bob", 42);
idToName.put(42, "Bob");
2、BiMap 提供了多种实现:
| 键值映射实现 | 值键映射实现 | 对应BiMap |
|---|---|---|
| HashMap | HashMap | HashBiMap |
| ImmutableMap | ImmutableMap | ImmutableBiMap |
| EnumMap | EnumMap | EnumBiMap |
| EnumMap | HashMap | EnumHashBiMap |
在线演示源码:
https://github.com/wangmaoxiong/apache-study/blob/master/src/main/java/com/wmx/guava/BiMapTest.java
1、当试图一次在多个键上建立索引时,您将得到类似 Map<FirstName,Map<LastName,Person>> 的代码,这很难看,而且使用起来很尴尬。Guava 提供了一个新的集合类型 Table,它支持任何“row”类型和“column”类型的这个用例。
2、Table 提供了多种实现:
HashMap<R,HashMap<C,V>> 支持的。TreeMap<R,TreeMap<C,V>> 支撑的。在线演示源码:
https://github.com/wangmaoxiong/apache-study/blob/master/src/main/java/com/wmx/guava/TableTest.java
1、有时 key 并不是单一的类型,而是多种类型,Guava 为此提供了 ClassToInstanceMap,key 可以是多种类型,value 是此类型的实例。
2、ClassToInstanceMap 的实现有: MutableClassToInstanceMap 和 ImmutableClassToInstanceMap 的实现。
在线演示源码:
https://github.com/wangmaoxiong/src/main/java/com/wmx/guava/ClassToInstanceMapTest.java
1、任何有 JDK 集合框架经验的程序员都知道并喜欢其中提供的实用程序 java.util.Collections,Guava 提供了许多适用于集合的静态方法实用程序。
| 接口 | 属于 JDK 还是 Guava | 对应 Guava API |
|---|---|---|
| Collection | JDK | Collections2 |
| List | JDK | Lists |
| Set | JDK | Sets |
| SortedSet | JDK | Sets |
| Map | JDK | Maps |
| SortedMap | JDK | Maps |
| Queue | JDK | Queues |
| Multiset | Guava | Multisets |
| Multimap | Guava | Multimaps |
| BiMap | Guava | Maps |
| Table | Guava | Tables |
Lists 在线演示:
https://github.com/wangmaoxiong/apache-study/blob/master/src/main/java/com/wmx/guava/ListsTest.java
Sets 在线演示:
https://github.com/wangmaoxiong/apache-study/blob/master/src/main/java/com/wmx/guava/SetsTest.java
1、Guava 为 Java JDK 的基本类型提供了实用程序类:
| 基本类型 | Guava 辅助工具类 |
|---|---|
| byte | Bytes, SignedBytes, UnsignedBytes |
| short | Shorts |
| int | Ints, UnsignedInteger, UnsignedInts |
| long | Longs, UnsignedLong, UnsignedLongs |
| float | Floats |
| double | Doubles |
| char | Chars |
| boolean | Booleans |
nts 在线演示源码:
https://github.com/wangmaoxiong/apache-study/blob/master/src/main/java/com/wmx/guava/IntsTest.java
doubles 在线演示源码:
https://github.com/src/main/java/com/wmx/guava/DoublesTest.java
booleans 在线演示源码:
https://github.com/src/main/java/com/wmx/guava/BooleansTest.java
其它类型同理。
1、Strings 类中提供了少数几个常用的符串实用程序。
2、Joiner 是连接器,用于连接 java.lang.Iterable、java.util.Iterator、java.lang.Object[] 中的元素。
在线演示源码:https://github.com/wangmaoxiong/apache-study/blob/master/src/main/java/com/wmx/guava/JoinerTest.java
3、Splitter 是分割器,用于分割字符序列 java.lang.CharSequence。
4、CharMatcher 字符匹配器,用于匹配字符,可以将 CharMatcher 视为代表一类特定的字符,如数字或空白。注意:CharMatcher 只处理 char 值。
1、google 的秒表 Stopwatch 相比 Spring framewrk core 包 和 apache commons lang3 包的秒表是最方便使用的。
2、此类不是线程安全的。
/**
* Stopwatch createStarted():创建(并启动)一个新的秒表,使用 System#nanoTime 来作为其时间源。
* Stopwatch createUnstarted():创建(但不启动)一个新的秒表,使用 System#nanoTime 来作为其时间源。
* long elapsed(TimeUnit desiredUnit):返回此秒表上显示的当前已用时间,以所需的时间单位表示,任何分数向下舍入
* boolean isRunning():如果已在此秒表上调用start()},并且自上次调用start()以来未调用stop(),则返回true
* Stopwatch reset():将此秒表的运行时间设置为零,并将其置于停止状态。
* Stopwatch start():启动秒表,如果秒表已经在运行,则 IllegalStateException
* Stopwatch stop():停止秒表,将来的读取将返回到目前为止经过的固定持续时间。
* tring toString():返回当前运行时间的字符串表示形式,比如 2.588 s,106.8 ms
*/
@Test
public void testStopwatch() throws InterruptedException {
SecureRandom secureRandom = new SecureRandom();
Stopwatch stopwatch = Stopwatch.createStarted();
int nextInt = secureRandom.nextInt(2000);
System.out.println("任务1预算耗时:" + nextInt);//任务1预算耗时:81
TimeUnit.MILLISECONDS.sleep(nextInt);
System.out.println("\t任务1实际耗时:" + stopwatch.elapsed(TimeUnit.MILLISECONDS) + "(毫秒)");// 任务1实际耗时:563(毫秒)
stopwatch.reset().start();
nextInt = secureRandom.nextInt(4000);
System.out.println("任务2预算耗时:" + nextInt);//任务2预算耗时:1591
TimeUnit.MILLISECONDS.sleep(nextInt);
System.out.println("\t任务2实际耗时:" + stopwatch.toString());// 任务2实际耗时:1.592 s
stopwatch.reset().start();
nextInt = secureRandom.nextInt(3000);
System.out.println("任务3预计耗时:" + nextInt);//任务3预计耗时:1964
TimeUnit.MILLISECONDS.sleep(nextInt);
System.out.println("\t任务3实际耗时:" + stopwatch.stop().toString());// 任务3实际耗时:1.965 s
}
觉得不错,就用起来吧!
版权声明:本文为CSDN博主「蚩尤后裔」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/wangmx1993328/article/details/103533060
近期热文推荐:
1.1,000+ 道 Java面试题及答案整理(2022最新版)
4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!
觉得不错,别忘了随手点赞+转发哦!
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po