news 2026/4/18 14:29:51

Google Guava:现代Java编程的秘密武器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Google Guava:现代Java编程的秘密武器

1. Guava入门基础

1.1 什么是Google Guava

Google Guava是由Google开发并开源的一个Java核心库,它提供了许多JDK没有的功能,帮助开发者编写更简洁、更安全、更高效的代码。

Guava的核心目标包括:

  • 提供实用的集合类型和工具类
  • 增强I/O功能
  • 实用的并发工具
  • 常用的字符串处理功能
  • 缓存实现和其他有用的工具

1.2 Guava的发展历程与版本演进

Guava最初源于Google内部的"Google Collections Library",于2010年开源并更名为Guava。Guava遵循语义化版本控制,定期发布新版本,持续添加新功能和改进现有功能。

主要里程碑:

  • 2010年:首次发布为开源项目
  • 持续更新:每季度发布新版本
  • 功能扩展:从单纯的集合库发展为综合性工具库

1.3 为什么选择Guava

使用Guava的主要优势:

提高开发效率

// 不使用Guava的传统写法List<String>list=newArrayList<>();list.add("apple");list.add("banana");list.add("orange");// 使用Guava的简洁写法List<String>list=Lists.newArrayList("apple","banana","orange");

减少样板代码

// 传统方式检查nullif(name!=null&&!name.isEmpty()){// 处理name}// 使用Guava的Strings工具if(!Strings.isNullOrEmpty(name)){// 处理name}

增强代码安全性

// 创建不可变集合,防止意外修改ImmutableList<String>immutableList=ImmutableList.of("a","b","c");// immutableList.add("d"); // 编译时报错

1.4 环境搭建与依赖配置

在Maven项目中添加Guava依赖:

<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>32.1.3-jre</version></dependency>

在Gradle项目中添加依赖:

implementation 'com.google.guava:guava:32.1.3-jre'

简单的使用示例:

importcom.google.common.collect.Lists;importcom.google.common.base.Strings;publicclassGuavaExample{publicstaticvoidmain(String[]args){// 使用Guava创建列表List<String>fruits=Lists.newArrayList("apple","banana","orange");// 使用Guava字符串工具Stringname=" Lingma ";if(!Strings.isNullOrEmpty(name)){System.out.println("Hello, "+name.trim());}}}

2. 集合工具类详解

2.1 不可变集合:ImmutableListImmutableMapImmutableSet

不可变集合一旦创建就不能被修改,这有助于:

  • 防止意外修改数据
  • 线程安全
  • 可作为常量使用
// 创建不可变列表ImmutableList<String>immutableList=ImmutableList.of("apple","banana","orange");ImmutableList<String>copiedList=ImmutableList.copyOf(Arrays.asList("one","two","three"));// 创建不可变映射ImmutableMap<String,Integer>immutableMap=ImmutableMap.of("apple",1,"banana",2,"orange",3);// 使用builder模式创建复杂不可变集合ImmutableMap<String,Integer>builtMap=ImmutableMap.<String,Integer>builder().put("key1",1).put("key2",2).put("key3",3).build();// 尝试修改会抛出UnsupportedOperationException异常try{immutableList.add("grape");}catch(UnsupportedOperationExceptione){System.out.println("Cannot modify immutable collection");}

2.2 新集合类型:MultimapMultisetBiMap

Guava提供了多种新的集合类型来解决特定问题:

// Multimap:一个键可以对应多个值Multimap<String,String>multimap=ArrayListMultimap.create();multimap.put("fruit","apple");multimap.put("fruit","banana");multimap.put("vegetable","carrot");multimap.put("vegetable","broccoli");System.out.println(multimap.get("fruit"));// [apple, banana]// Multiset:可以统计元素出现次数的集合Multiset<String>multiset=HashMultiset.create();multiset.add("apple");multiset.add("banana");multiset.add("apple");multiset.add("orange");multiset.add("apple");System.out.println(multiset.count("apple"));// 3System.out.println(multiset.elementSet());// [apple, banana, orange]// BiMap:双向映射,键和值都唯一BiMap<String,Integer>biMap=HashBiMap.create();biMap.put("one",1);biMap.put("two",2);biMap.put("three",3);System.out.println(biMap.get("one"));// 1System.out.println(biMap.inverse().get(2));// two

2.3 集合操作工具:ListsMapsSets

Guava提供了丰富的静态工具方法来操作集合:

// Lists工具类List<Integer>numbers=Lists.newArrayList(1,2,3,4,5);List<List<Integer>>partitions=Lists.partition(numbers,2);// [[1, 2], [3, 4], [5]]// 创建笛卡尔积List<String>colors=Lists.newArrayList("red","blue");List<String>shapes=Lists.newArrayList("circle","square");List<List<String>>cartesianProduct=Lists.cartesianProduct(colors,shapes);// [[red, circle], [red, square], [blue, circle], [blue, square]]// Maps工具类Map<String,String>map1=Maps.newHashMap();map1.put("key1","value1");map1.put("key2","value2");// 创建带默认值的映射Map<String,Integer>defaultMap=Maps.newHashMap();Integervalue=Maps.safeGet(defaultMap,"nonexistent",0);// 返回默认值0// Sets工具类Set<Integer>set1=Sets.newHashSet(1,2,3);Set<Integer>set2=Sets.newHashSet(3,4,5);Set<Integer>union=Sets.union(set1,set2);// {1, 2, 3, 4, 5}Set<Integer>intersection=Sets.intersection(set1,set2);// {3}Set<Integer>difference=Sets.difference(set1,set2);// {1, 2}

2.4 集合工厂方法与创建器模式

Guava提供了多种创建集合的方式:

// 工厂方法创建集合List<String>list=Lists.newArrayList("a","b","c");Set<Integer>set=Sets.newHashSet(1,2,3);Map<String,Integer>map=Maps.newHashMap();// 使用Builder模式创建复杂集合ImmutableList.Builder<String>builder=ImmutableList.builder();builder.add("first").add("second").addAll(Arrays.asList("third","fourth")).add("fifth");ImmutableList<String>result=builder.build();// 创建容量预设的集合List<String>preSizedList=Lists.newArrayListWithExpectedSize(100);Set<Integer>preSizedSet=Sets.newHashSetWithExpectedSize(50);

3. 函数式编程支持

3.1Function接口与转换操作

Function接口用于将一种类型的对象转换为另一种类型:

importcom.google.common.base.Function;importcom.google.common.collect.Collections2;// 定义转换函数Function<String,Integer>stringLengthFunction=newFunction<String,Integer>(){@OverridepublicIntegerapply(Stringinput){returninput.length();}};// 使用转换函数List<String>words=Arrays.asList("hello","world","java","guava");Collection<Integer>lengths=Collections2.transform(words,stringLengthFunction);System.out.println(lengths);// [5, 5, 4, 5]// 使用Lambda表达式(Java 8+)Function<String,String>upperCaseFunction=String::toUpperCase;Collection<String>upperWords=Collections2.transform(words,upperCaseFunction);System.out.println(upperWords);// [HELLO, WORLD, JAVA, GUAVA]

3.2Predicate接口与过滤操作

Predicate接口用于判断对象是否满足某种条件:

importcom.google.common.base.Predicate;importcom.google.common.collect.Collections2;// 定义谓词Predicate<String>longWordPredicate=newPredicate<String>(){@Overridepublicbooleanapply(Stringinput){returninput.length()>4;}};// 使用过滤器List<String>words=Arrays.asList("hello","hi","world","java","go");Collection<String>filteredWords=Collections2.filter(words,longWordPredicate);System.out.println(filteredWords);// [hello, world]// 组合谓词Predicate<String>shortWordPredicate=newPredicate<String>(){@Overridepublicbooleanapply(Stringinput){returninput.length()<5;}};// AND组合Predicate<String>andPredicate=Predicates.and(longWordPredicate,shortWordPredicate);// OR组合Predicate<String>orPredicate=Predicates.or(longWordPredicate,shortWordPredicate);// NOT组合Predicate<String>notPredicate=Predicates.not(longWordPredicate);// 使用Lambda表达式Predicate<String>lambdaPredicate=s->s.startsWith("h");Collection<String>startsWithH=Collections2.filter(words,lambdaPredicate);System.out.println(startsWithH);// [hello, hi]

3.3Optional类:避免空指针异常

Optional用于优雅地处理可能为空的值:

importcom.google.common.base.Optional;// 创建Optional实例Optional<String>presentOptional=Optional.of("Hello");Optional<String>absentOptional=Optional.absent();Optional<String>fromNullableOptional=Optional.fromNullable(null);// 检查值是否存在if(presentOptional.isPresent()){System.out.println("Value: "+presentOptional.get());}// 提供默认值StringvalueOrDefault=absentOptional.or("default");System.out.println(valueOrDefault);// default// 使用orNull获取可能为null的值StringnullableValue=fromNullableOptional.orNull();System.out.println(nullableValue);// null// 转换Optional中的值Optional<Integer>lengthOptional=presentOptional.transform(String::length);System.out.println(lengthOptional.get());// 5// 实际应用场景publicOptional<String>findUserEmail(LonguserId){// 模拟数据库查询if(userId==1L){returnOptional.of("user@example.com");}else{returnOptional.absent();}}// 使用OptionalOptional<String>email=findUserEmail(1L);if(email.isPresent()){System.out.println("Email: "+email.get());}else{System.out.println("User not found");}

3.4 Fluent API设计模式实践

Fluent API让代码更加流畅易读:

importcom.google.common.collect.Ordering;// Ordering示例List<String>words=Arrays.asList("banana","apple","cherry","date");// 链式调用排序Ordering<String>byLengthOrdering=Ordering.natural().onResultOf((Stringstr)->str.length()).compound(Ordering.natural());List<String>sortedWords=byLengthOrdering.sortedCopy(words);System.out.println(sortedWords);// [date, apple, banana, cherry]// 复杂排序示例List<Person>persons=Arrays.asList(newPerson("Alice",25),newPerson("Bob",30),newPerson("Charlie",25));Ordering<Person>personOrdering=Ordering.natural().onResultOf((Personp)->p.getAge()).compound(Ordering.natural().onResultOf((Personp)->p.getName()));List<Person>sortedPersons=personOrdering.sortedCopy(persons);

4. 字符串处理利器

4.1Strings工具类的使用

Strings工具类提供了许多实用的字符串处理方法:

importcom.google.common.base.Strings;// 检查字符串是否为空或nullSystem.out.println(Strings.isNullOrEmpty(null));// trueSystem.out.println(Strings.isNullOrEmpty(""));// trueSystem.out.println(Strings.isNullOrEmpty(" "));// false// 填充字符串StringpaddedLeft=Strings.padStart("7",3,'0');System.out.println(paddedLeft);// "007"StringpaddedRight=Strings.padEnd("7",3,'0');System.out.println(paddedRight);// "700"// 重复字符串Stringrepeated=Strings.repeat("abc",3);System.out.println(repeated);// "abcabcabc"// 获取公共前缀StringcommonPrefix=Strings.commonPrefix("hello","help");System.out
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 23:33:44

揭秘Open-AutoGLM任务中断真相:3步实现毫秒级状态监控响应

第一章&#xff1a;Open-AutoGLM 任务状态实时监控在部署和运行 Open-AutoGLM 模型任务时&#xff0c;实时监控任务的执行状态是保障系统稳定性和调试效率的关键环节。通过内置的监控接口与外部可视化工具集成&#xff0c;用户能够动态追踪任务进度、资源消耗及异常事件。监控接…

作者头像 李华
网站建设 2026/4/17 21:21:32

错过将落后一年:Open-AutoGLM语义关联分析最新强化路径曝光

第一章&#xff1a;Open-AutoGLM语义关联分析强化的革命性突破Open-AutoGLM 的推出标志着自然语言理解领域在语义关联建模方面迈出了关键一步。该框架通过深度融合生成式语言模型与图神经网络&#xff0c;实现了对复杂语义关系的动态捕捉与推理增强&#xff0c;显著提升了跨文本…

作者头像 李华
网站建设 2026/4/18 6:34:54

GBase 8c数据迁移之mysql增量迁移

在国产化数据库替代趋势下&#xff0c;将 MySQL 数据迁移至 GBase 8c 成为许多企业的选择。GBase DMT 作为南大通用推出的专业迁移工具&#xff0c;支持异构数据库间的结构迁移、数据迁移及校验&#xff0c;能大幅降低迁移难度。本文将从前期准备、迁移配置到任务执行&#xff…

作者头像 李华
网站建设 2026/4/18 3:44:07

GBase 8s 之集合属性

GBase 8s 提供了一系列集合属性和方法&#xff0c;用于操作和管理集合变量。本文将详细介绍 GBase 8s 中集合属性的使用方法&#xff0c;并通过实际示例展示其应用。集合属性简介GBase 8s 提供了多种集合属性&#xff0c;用于操作和管理集合变量。这些属性包括&#xff1a;- co…

作者头像 李华
网站建设 2026/4/18 6:34:17

Linly-Talker与Unity引擎结合的可能性探讨

Linly-Talker与Unity引擎结合的可能性探讨 在虚拟主播直播间里&#xff0c;一个数字人正自然地回答观众提问&#xff0c;语气生动、口型精准、表情丰富——这不再是科幻电影的桥段&#xff0c;而是当下AI与实时渲染技术融合的真实写照。随着大模型、语音处理和动画驱动技术的成…

作者头像 李华
网站建设 2026/4/18 6:38:40

数据泄露风险激增?Open-AutoGLM安全防护体系构建的8个不可忽视环节

第一章&#xff1a;数据泄露风险激增&#xff1f;Open-AutoGLM安全防护体系构建的8个不可忽视环节随着大模型在企业场景中的广泛应用&#xff0c;Open-AutoGLM作为自动化生成语言模型平台&#xff0c;面临日益严峻的数据安全挑战。构建一套系统化的安全防护体系&#xff0c;已成…

作者头像 李华