Supplier用于创建对象。
public interface Supplier<T> {
T get();
}
google为我们提供的supplier的实现为Suppliers.
比较有意思的方法为:
static class MemoizingSupplier<T> implements Supplier<T>, Serializable {
final Supplier<T> delegate;
transient volatile boolean initialized;
// "value" does not need to be volatile; visibility piggy-backs
// on volatile read of "initialized".
transient T value;
MemoizingSupplier(Supplier<T> delegate) {
this.delegate = delegate;
}
@Override
public T get() {
// A 2-field variant of Double Checked Locking.
if (!initialized) {
synchronized (this) {
if (!initialized) {
T t = delegate.get();
value = t;
initialized = true;
return t;
}
}
}
return value;
}
@Override
public String toString() {
return "Suppliers.memoize(" + delegate + ")";
}
private static final long serialVersionUID = 0;
}
该类为我们缓存一个对象。
还有一个方法:
static class ExpiringMemoizingSupplier<T> implements Supplier<T>, Serializable {
final Supplier<T> delegate;
final long durationNanos;
transient volatile T value;
// The special value 0 means "not yet initialized".
transient volatile long expirationNanos;
ExpiringMemoizingSupplier(Supplier<T> delegate, long duration, TimeUnit unit) {
this.delegate = Preconditions.checkNotNull(delegate);
this.durationNanos = unit.toNanos(duration);
Preconditions.checkArgument(duration > 0);
}
@Override
public T get() {
// Another variant of Double Checked Locking.
//
// We use two volatile reads. We could reduce this to one by
// putting our fields into a holder class, but (at least on x86)
// the extra memory consumption and indirection are more
// expensive than the extra volatile reads.
long nanos = expirationNanos;
long now = Platform.systemNanoTime();
if (nanos == 0 || now - nanos >= 0) {
synchronized (this) {
if (nanos == expirationNanos) { // recheck for lost race
T t = delegate.get();
value = t;
nanos = now + durationNanos;
// In the very unlikely event that nanos is 0, set it to 1;
// no one will notice 1 ns of tardiness.
expirationNanos = (nanos == 0) ? 1 : nanos;
return t;
}
}
}
return value;
}
该类缓存了一个带时间的对象如果时间过期就重新创建一个对象
分享到:
相关推荐
例如,Guava的`com.google.common.base.Function`接口和`com.google.common.collect.Lists.transform`方法可以让开发者方便地转换和操作列表,实现函数式编程风格的数据处理。 【总结】 函数式编程虽不能完全替代...
Stream API常用操作,初步理解stream操作方法,对java8有初步认知。
3. **函数式编程**:Guava支持函数式编程,包括Function、Predicate、Transformer等接口,便于编写简洁的代码。 4. **并发处理**:Guava提供了强大的并发工具,如ListenableFuture、CountDownLatch、CyclicBarrier...
《Guava中的并行编程与Futures详解》 在Java并行编程中,Google的Guava库提供了一套强大的工具,极大地丰富了Future接口的功能,尤其是ListenableFuture接口及其相关的扩展。这些工具使得异步计算的管理和处理变得...
3. **函数式编程**:Guava引入了Function、Predicate和Transformer等接口,支持函数式编程风格,便于代码的编写和测试。 4. **缓存机制**:Guava提供了本地缓存实现,可以帮助开发者轻松地在应用程序中构建高效的...
├─Google Guava 第06讲-Guava之函数式接口(非常类似Java8,熟悉的可以不看).wmv ├─Google Guava 第07讲-Guava之StopWatch和JDK之ServiceLoader讲解.wmv ├─Google Guava 第08讲-Guava之Files讲解(废话比较多)...
Guava 支持函数式编程风格,包括 Function 接口,可以将一个对象转换为另一个对象,以及 Predicates,用于创建可重用的条件检查。 5. **字符串处理** Guava 提供了有用的字符串工具,如 Joiner 和 Splitter,用于...
guava 使用方法 教程
7. **函数式编程**:Guava引入了函数式编程的概念,如Function、Predicate和Supplier接口,使得代码更加简洁,易于测试和维护。 8. **事件监听**:Guava的EventBus是一种发布-订阅事件总线,用于组件之间的松耦合...
此外,Guava还提供了Predicates(谓词)、Combinators(组合器)和Comparators(比较器)等工具,进一步增强了函数式编程的能力。 六、I/O工具 Guava的IO模块提供了流式处理的读写操作,如CharSource和ByteSource...
3. **函数式编程**:Guava支持函数式编程风格,包括Function、Predicate、Transformer等接口,使得代码更简洁,更易于测试和维护。 4. **并发工具**:Guava提供了丰富的并发工具类,如 ListeningExecutorService、...
3. **函数式编程**:Guava引入了Function、Predicate等接口,支持函数式编程风格,便于编写无副作用的代码和进行数据转换。 4. **并发支持**:Guava提供了更高级的并发工具,如RateLimiter(限流器)、Service...
- **函数式编程**:Guava 引入了 Function 和 Predicate 等接口,促进了函数式编程风格在 Java 中的应用。 - **并发**:Guava 提供了更高级别的并发工具,如 ListenableFuture、Service 等,简化了异步编程和系统...
总而言之,《Guava是个风火轮之基础工具(3)Java开发Java经》这份资料全面地介绍了Guava在Java开发中的各种应用场景,无论是集合处理、缓存管理、函数式编程,还是并发和安全控制,都为我们提供了强大的工具和实践...
Guava是Google的一个核心库,它提供了很多Java平台的基础工具,包括集合、缓存、原生类型支持、并发、函数式编程、字符串处理等多个方面。而"r09"表示这是Guava的第9个发布版本。 描述中的"org.apache.hadoop.third...
4. **函数式编程**:Guava引入了函数式编程的概念,如Function、Predicate和Transformer接口,使代码更简洁,易于理解和测试。 5. **字符串处理**:Guava提供了Strings类,包含各种静态方法来处理和格式化字符串,...
4. **函数式编程**:Guava 支持函数式编程风格,提供了 Function、Predicate 等接口,可以用于数据转换和过滤。 5. **字符串处理**:Guava 提供了各种字符串工具,如 Joiner、Splitter 和 CharMatcher,可以更方便...
4. **函数式编程**:Guava引入了函数接口(Function、Predicate等)和Optional类,这使得Java代码可以更接近函数式编程风格,提高代码的可读性和可维护性。 5. **字符串处理**:Guava的Strings类包含一系列静态方法...
函数式编程** Guava引入了Function、Predicate、Supplier等函数式接口,支持lambda表达式的使用,使得代码更加简洁、可读性更强。Compose、andThen方法则方便了函数的组合。 **7. 正则表达式** Guava的Regex类提供...
Guava提供了一些函数式编程的工具,如Function、Predicate、Transformer等接口,它们可以用来编写更简洁、可读性更强的代码。例如,Function接口用于表示一个接受一个参数并返回一个结果的函数。 4. **并发工具** ...