“又写if(list != null && !list.isEmpty())?这种代码我快写吐了!” 别急!今天给你介绍Google工程师们私藏的Guava工具包——它就像装满各种美味糖果的罐子,能让你的Java代码甜度飙升,苦味全无!
Guava是Google开源的Java核心库,包含:
…等数百个实用工具方法!
<dependency>
<groupId>com.google.guavagroupId>
<artifactId>guavaartifactId>
<version>32.1.3-jreversion>
dependency>
// 传统JDK集合
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("a"); // 允许重复
// Guava的超级集合
Multiset<String> multiset = HashMultiset.create();
multiset.add("a", 2); // 直接添加2个"a"
multiset.count("a"); // 返回2 → 统计元素出现次数
更多甜蜜操作:
// 双向Map(键值都能查)
BiMap<String, Integer> biMap = HashBiMap.create();
biMap.put("Alice", 1);
biMap.inverse().get(1); // 返回"Alice"
// 多重Map(一键多值)
Multimap<String, String> multimap = ArrayListMultimap.create();
multimap.put("fruit", "apple");
multimap.put("fruit", "banana");
multimap.get("fruit"); // ["apple", "banana"]
// 传统"不可变"集合(其实还能改!)
List<String> list = Collections.unmodifiableList(new ArrayList<>());
list.add("oops"); // 运行时抛出UnsupportedOperationException
// 真正的不可变集合(编译期就安全)
ImmutableList<String> imList = ImmutableList.of("a", "b", "c");
imList.add("oops"); // 直接编译报错!
// 传统过滤写法
List<Integer> filtered = new ArrayList<>();
for (Integer num : numbers) {
if (num % 2 == 0) filtered.add(num);
}
// Guava函数式写法
Iterables.filter(numbers, num -> num % 2 == 0);
// 自定义函数对象
Function<String, Integer> lengthFunc = new Function<>() {
public Integer apply(String input) {
return input.length();
}
};
Collections2.transform(list, lengthFunc); // 转换集合元素
注意:Java 8后可以用Stream API,但Guava在Java 7及以下环境仍是救星!
// 拼接字符串
String joined = Joiner.on("|").skipNulls().join("a", null, "b"); // "a|b"
// 拆分字符串(超强容错)
Splitter.on(',')
.trimResults()
.omitEmptyStrings()
.split("a,,b, c"); // ["a", "b", "c"]
// 字符匹配
CharMatcher.digit().retainFrom("a1b2c3"); // "123"
LoadingCache<String, User> userCache = CacheBuilder.newBuilder()
.maximumSize(1000) // 最大缓存数
.expireAfterWrite(10, TimeUnit.MINUTES) // 过期时间
.build(new CacheLoader<String, User>() { // 自动加载逻辑
public User load(String key) {
return userDao.findById(key);
}
});
// 使用缓存(不存在时自动调用load)
User user = userCache.get("user123");
// 传统数组处理
int[] array = {1, 2, 3};
Arrays.asList(array); // 悲剧!得到List而非List
// Guava的救赎
List<Integer> list = Ints.asList(1, 2, 3); // 完美转换
int[] array2 = Ints.toArray(list); // 反向转换
Ints.compare(1, 2); // 安全的原生类型比较
场景 | JDK写法 | Guava写法 | 优势 |
---|---|---|---|
集合初始化 | Arrays.asList(“a”, “b”, “c”) | ImmutableList.of(“a”, “b”) | 真正不可变 |
字符串拼接 | String.join(“,”, list) | Joiner.on("\t").join(list) |
支持跳过null |
缓存实现 | HashMap + 手动过期逻辑 | CacheBuilder | 自动过期/淘汰策略 |
多重Map | Map |
Multimap |
API更直观 |
// 方法返回不可变集合
public ImmutableList<String> getConfigs() {
return ImmutableList.copyOf(rawConfigs);
}
public void process(String input) {
Preconditions.checkNotNull(input, "input不能为null");
Preconditions.checkArgument(input.length() > 5, "input长度需大于5");
}
Stopwatch stopwatch = Stopwatch.createStarted();
doSomething();
long millis = stopwatch.elapsed(TimeUnit.MILLISECONDS);
int min = Ints.min(1, 3, 5); // 1
double mean = DoubleMath.mean(10.0, 20.0); // 15.0
// 不推荐在超高频循环中使用
for (int i = 0; i < 1_000_000; i++) {
Strings.isNullOrEmpty(str); // 有微小开销
}
小菜:“那我该优先学习Guava的哪部分?”
老鸟:“先吃透Collections和Strings工具类,它们就像糖果罐里的巧克力——最常用也最美味!”
行动清单:
记住:Guava不是银弹,但绝对是Java开发者的"瑞士军刀"。现在就去品尝这些"代码糖果"吧!