`

guava 函数式编程三兄弟之Supplier的用法

阅读更多
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;
    }
该类缓存了一个带时间的对象如果时间过期就重新创建一个对象
分享到:
评论

相关推荐

    83丨开源实战三(下):借GoogleGuava学习三大编程范式中的函数式编程1

    例如,Guava的`com.google.common.base.Function`接口和`com.google.common.collect.Lists.transform`方法可以让开发者方便地转换和操作列表,实现函数式编程风格的数据处理。 【总结】 函数式编程虽不能完全替代...

    Stream API函数式编程和Guava操作

    Stream API常用操作,初步理解stream操作方法,对java8有初步认知。

    guava-23.0.zip guava.jar guava

    3. **函数式编程**:Guava支持函数式编程,包括Function、Predicate、Transformer等接口,便于编写简洁的代码。 4. **并发处理**:Guava提供了强大的并发工具,如ListenableFuture、CountDownLatch、CyclicBarrier...

    Guava-并行编程Futures详解.pdf

    《Guava中的并行编程与Futures详解》 在Java并行编程中,Google的Guava库提供了一套强大的工具,极大地丰富了Future接口的功能,尤其是ListenableFuture接口及其相关的扩展。这些工具使得异步计算的管理和处理变得...

    guava-18.0(guava-18.0.jar和guava-18.0-sources.jar)

    3. **函数式编程**:Guava引入了Function、Predicate和Transformer等接口,支持函数式编程风格,便于代码的编写和测试。 4. **缓存机制**:Guava提供了本地缓存实现,可以帮助开发者轻松地在应用程序中构建高效的...

    不加密Google Guava视频教程.txt

    ├─Google Guava 第06讲-Guava之函数式接口(非常类似Java8,熟悉的可以不看).wmv ├─Google Guava 第07讲-Guava之StopWatch和JDK之ServiceLoader讲解.wmv ├─Google Guava 第08讲-Guava之Files讲解(废话比较多)...

    Google Guava 官方教程

    Guava 支持函数式编程风格,包括 Function 接口,可以将一个对象转换为另一个对象,以及 Predicates,用于创建可重用的条件检查。 5. **字符串处理** Guava 提供了有用的字符串工具,如 Joiner 和 Splitter,用于...

    guava使用方法教程

    guava 使用方法 教程

    guava14.0.1jar包

    7. **函数式编程**:Guava引入了函数式编程的概念,如Function、Predicate和Supplier接口,使得代码更加简洁,易于测试和维护。 8. **事件监听**:Guava的EventBus是一种发布-订阅事件总线,用于组件之间的松耦合...

    google guava 中文教程

    此外,Guava还提供了Predicates(谓词)、Combinators(组合器)和Comparators(比较器)等工具,进一步增强了函数式编程的能力。 六、I/O工具 Guava的IO模块提供了流式处理的读写操作,如CharSource和ByteSource...

    guava-26.0-jre.zip

    3. **函数式编程**:Guava支持函数式编程风格,包括Function、Predicate、Transformer等接口,使得代码更简洁,更易于测试和维护。 4. **并发工具**:Guava提供了丰富的并发工具类,如 ListeningExecutorService、...

    guava-18.0资料

    3. **函数式编程**:Guava引入了Function、Predicate等接口,支持函数式编程风格,便于编写无副作用的代码和进行数据转换。 4. **并发支持**:Guava提供了更高级的并发工具,如RateLimiter(限流器)、Service...

    Guava 工程项目包 有实例

    - **函数式编程**:Guava 引入了 Function 和 Predicate 等接口,促进了函数式编程风格在 Java 中的应用。 - **并发**:Guava 提供了更高级别的并发工具,如 ListenableFuture、Service 等,简化了异步编程和系统...

    Guava是个风火轮之基础工具(3)Java开发Java经

    总而言之,《Guava是个风火轮之基础工具(3)Java开发Java经》这份资料全面地介绍了Guava在Java开发中的各种应用场景,无论是集合处理、缓存管理、函数式编程,还是并发和安全控制,都为我们提供了强大的工具和实践...

    guava-r09-jarjar.jar

    Guava是Google的一个核心库,它提供了很多Java平台的基础工具,包括集合、缓存、原生类型支持、并发、函数式编程、字符串处理等多个方面。而"r09"表示这是Guava的第9个发布版本。 描述中的"org.apache.hadoop.third...

    guava(google的java集合包)

    4. **函数式编程**:Guava引入了函数式编程的概念,如Function、Predicate和Transformer接口,使代码更简洁,易于理解和测试。 5. **字符串处理**:Guava提供了Strings类,包含各种静态方法来处理和格式化字符串,...

    Getting Started with Google Guava code

    4. **函数式编程**:Guava 支持函数式编程风格,提供了 Function、Predicate 等接口,可以用于数据转换和过滤。 5. **字符串处理**:Guava 提供了各种字符串工具,如 Joiner、Splitter 和 CharMatcher,可以更方便...

    Guava常用类库 v33.0.0.zip

    4. **函数式编程**:Guava引入了函数接口(Function、Predicate等)和Optional类,这使得Java代码可以更接近函数式编程风格,提高代码的可读性和可维护性。 5. **字符串处理**:Guava的Strings类包含一系列静态方法...

    Google-guava 19.0

    函数式编程** Guava引入了Function、Predicate、Supplier等函数式接口,支持lambda表达式的使用,使得代码更加简洁、可读性更强。Compose、andThen方法则方便了函数的组合。 **7. 正则表达式** Guava的Regex类提供...

    guava 常用API说明

    Guava提供了一些函数式编程的工具,如Function、Predicate、Transformer等接口,它们可以用来编写更简洁、可读性更强的代码。例如,Function接口用于表示一个接受一个参数并返回一个结果的函数。 4. **并发工具** ...

Global site tag (gtag.js) - Google Analytics