大佬教程收集整理的这篇文章主要介绍了GitHub上星标39.9k+的开源类库,忍不住分享下,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>30.1-jre</version>
</dependency>
@H_801_1@一点要求,JDK 版本需要在 8 以上。
Optional<Integer> possible = Optional.of(5);
possible.isPresent(); // returns true
possible.get(); // returns 5
@H_801_1@我大哥 Java 在 JDK 8 中新增了 Optional 类,显然是从我这借鉴过去的,不过他的和我的有些不同。
CollectionS.UnmodifiableList(list)
得到一个不可修改的集合 unmodifiableList。
List list = new ArrayList();
list.add("雷军");
list.add("乔布斯");
List unmodifiableList = CollectionS.UnmodifiableList(list);
unmodifiableList.add("马云");
@H_801_1@运行代码将会出现以下异常:
Exception in thread "main" java.lang.UnsupportedoperationException
at java.base/java.util.Collections$UnmodifiableCollection.add(Collections.java:1060)
at com.itwanger.guava.NullTest.main(NullTest.java:29)
@H_801_1@很好,执行 unmodifiableList.add()
的时候抛出了 UnsupportedoperationException 异常,说明 CollectionS.UnmodifiableList()
返回了一个不可变集合。但真的是这样吗?
@H_801_1@你可以把 unmodifiableList.add()
换成 list.add()
。
List list = new ArrayList();
list.add("雷军");
list.add("乔布斯");
List unmodifiableList = CollectionS.UnmodifiableList(list);
list.add("马云");
@H_801_1@再次执行的话,程序并没有报错,并且你会发现 unmodifiableList 中真的多了一个元素。说明什么呢?
@H_801_1@CollectionS.UnmodifiableList(…)
实现的不是真正的不可变集合,当原始集合被修改后,不可变集合里面的元素也是跟着发生变化。
@H_801_1@我就不会犯这种错,来看下面的代码。
List<String> StringArrayList = Lists.newArrayList("雷军","乔布斯");
ImmutableList<String> immutableList = ImmutableList.copyOf(StringArrayList);
immutableList.add("马云");
@H_801_1@尝试 immutableList.add()
的时候会抛出 UnsupportedoperationException
。我在源码中已经把 add()
方法废弃了。
/**
* Guaranteed to throw an exception and leave the collection unmodified.
*
* @throws UnsupportedoperationException always
* @deprecated Unsupported operation.
*/
@CanIgnoreReturnValue
@Deprecated
@Override
public final Boolean add(E E) {
throw new UnsupportedoperationException();
}
@H_801_1@尝试 StringArrayList.add()
修改原集合的时候 immutableList 并不会因此而发生改变。
@H_801_1@除了不可变集合以外,我还提供了新的集合类型,比如说:
inverse()
反转 BiMap
的键值映射;保证值是唯一的,因此 values()
返回 Set 而不是普通的 Collection。useForNull(String)
方法用某个字符串来替换 null,而不像 skipNulls()
方法那样直接忽略 null。
Joiner joiner = Joiner.on("; ").skipNulls();
return joiner.join("雷军", null, "乔布斯");
@H_801_1@我还提供了拆分器—— Splitter,可以按照指定的分隔符把字符串序列进行拆分。
Splitter.on(',')
.trimResults()
.omitEmptyStrings()
.split("雷军,乔布斯,, 沉默王二");
@Test
public void TESTCache() throws ExecutionException, InterruptedException {
CacHeloader cacHeloader = new CacHeloader<String, Animal>() {
// 如果找不到元素,会调用这里
@Override
public Animal load(String s) {
return null;
}
};
LoadingCache<String, Animal> loadingCache = CacheBuilder.newBuilder()
.maximumSize(1000) // 容量
.expireAfterWrite(3, TimeUnit.SECONDS) // 过期时间
.removalListener(new MyRemovalListener()) // 失效监听器
.build(cacHeloader); //
loadingCache.put("狗", new Animal("旺财", 1));
loadingCache.put("猫", new Animal("汤姆", 3));
loadingCache.put("狼", new Animal("灰太狼", 4));
loadingCache.invalidate("猫"); // 手动失效
Animal animal = loadingCache.get("狼");
System.out.println(animal);
Thread.sleep(4 * 1000);
// 狼已经自动过去,获取为 null 值报错
System.out.println(loadingCache.get("狼"));
}
/**
* 缓存移除监听器
*/
class @H_802_504@myRemovalListener implements RemovalListener<String, Animal> {
@Override
public void onRemoval(RemovalNotification<String, Animal> notification) {
String reason = String.format("key=%s,value=%s,reason=%s", notification.getKey(), notification.getValue(), notification.getCause());
System.out.println(reason);
}
}
class Animal {
private String name;
private Integer age;
public Animal(String name, Integer agE) {
this.name = name;
this.age = age;
}
}
@H_801_1@CacHeloader 中重写了 load 方法,这个方法会在查询缓存没有命中时被调用,我这里直接返回了 null,其实这样会在没有命中时抛出 CacHeloader returned null for key 异常信息。
@H_801_1@myRemovalListener 作为缓存元素失效时的监听类,在有元素缓存失效时会自动调用 onRemoval 方法,这里需要注意的是这个方法是同步方法,如果这里耗时较长,会阻塞直到处理完成。
@H_801_1@LoadingCache 就是缓存的主要操作对象了,常用的就是其中的 put 和 get 方法了。
以上是大佬教程为你收集整理的GitHub上星标39.9k+的开源类库,忍不住分享下全部内容,希望文章能够帮你解决GitHub上星标39.9k+的开源类库,忍不住分享下所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。