一、Equivalence

一种判定两个实例是否相等的策略

全路径:

com.google.common.base

声明:

@GwtCompatible

public abstract class Equivalence<T>

核心方法

equivalent()

public final boolean equivalent(@Nullable T a, @Nullable T b) {
if (a == b) {
return true;
}
if (a == null || b == null) {
return false;
}
return doEquivalent(a, b);
}

Equivalence<F> onResultOf(Function<F, ? extends T> function) 先计算funcion,在比较

boolean result = Equivalence.equals().onResultOf(new Function<Object, Object>() {
@Override
public Object apply(Object input) {
return null;
}
}).equivalent(1, 2);

Predicate<T> equivalentTo(@Nullable T target) 转成predicate

Map<String,Integer> result=Maps.filterKeys(ImmutableMap.of("a",1,"b",2),Equivalence.equals().equivalentTo("a"));

静态内部类 Equals(如其名,判断内容是否相等)

声明:

static final class Equals extends Equivalence<Object> implements Serializable

重写 doEquivalent

 @Override
protected boolean doEquivalent(Object a, Object b) {
return a.equals(b);
}

获得Equals实例

Equivalence.equals()

举个例子

 String s="abc";
String s1=new String("abc");
System.out.println(Equivalence.equals().equivalent(s,s1));//true

静态内部类 Identity (如其名,判断内存地址是否唯一)

声明:

static final class Identity extends Equivalence<Object> implements Serializable

重写 doEquivalent

 @Override
protected boolean doEquivalent(Object a, Object b) {
return false;
}

获得Equals实例

Equivalence.identity()

举个例子

  String s="abc";
String s1=new String("abc");
System.out.println(Equivalence.identity().equivalent(s,s1)); //false

子类 FunctionalEquivalence

声明:

final class FunctionalEquivalence<F, T> extends Equivalence<F> implements Serializabl

构造函数:

FunctionalEquivalence(Function<F, ? extends T> function, Equivalence<T> resultEquivalence) {
this.function = checkNotNull(function);
this.resultEquivalence = checkNotNull(resultEquivalence);
}

重写 doEquivalent

 @Override
protected boolean doEquivalent(F a, F b) {
return resultEquivalence.equivalent(function.apply(a), function.apply(b));
}

举个例子

看起来是经过function处理后,判断相等关系。default修饰符,暂时没看懂怎么使用 - -

子类 PairwiseEquivalence

声明:

final class PairwiseEquivalence<T> extends Equivalence<Iterable<T>> implements Serializable

构造函数

 PairwiseEquivalence(Equivalence<? super T> elementEquivalence) {
this.elementEquivalence = Preconditions.checkNotNull(elementEquivalence);
}

重写 doEquivalent

 @Override
protected boolean doEquivalent(Iterable<T> iterableA, Iterable<T> iterableB) {
Iterator<T> iteratorA = iterableA.iterator();
Iterator<T> iteratorB = iterableB.iterator(); while (iteratorA.hasNext() && iteratorB.hasNext()) {
if (!elementEquivalence.equivalent(iteratorA.next(), iteratorB.next())) {
return false;
}
} return !iteratorA.hasNext() && !iteratorB.hasNext();
}

举个例子

看起来是传入一种相等策略,判断两个集合中的元素是否完全相等,default修饰,暂时没看懂怎么使用

二、Supplier

惰性求值。我们可以把耗资源运算放到get方法里,在程序里,我们传递的是Supplier对象,直到调用get方法时,运算才会执行。

全路径:

com.google.common.base

定义

public interface Supplier<T> {
@CanIgnoreReturnValue
T get();
}

举个例子

 Supplier<Integer> supplier = new Supplier<Integer>() {
@Override
public Integer get() {
return 2;
}
};
int result=supplier.get();

Suppliers

工具类,提供一些静态方法,生成一些特殊的Supplier

Supplier<T> memoize(Supplier<T> delegate) 返回一个只计算一次的supplier

 Supplier supplier1= Suppliers.memoize(new Supplier<Object>() {
@Override
public Object get() {
return null;
}
});

Supplier<T> memoizeWithExpiration(Supplier<T> delegate, long duration, TimeUnit unit) 返回一个超时的supplier,超时后会重新计算

 Supplier supplier1= Suppliers.memoizeWithExpiration((new Supplier<Object>() {
@Override
public Object get() {
return null;
}
}),2,TimeUnit.HOURS);

Supplier<T> ofInstance(@Nullable T instance) 常量

Supplier supplier= Suppliers.ofInstance(2);

Supplier<T> compose(Function<? super F, T> function, Supplier<F> supplier) 先计算supplier,再计算funciton

Supplier supplier= Suppliers.compose(new Function<Object, Object>() {
@Override
public Object apply(Object input) {
System.out.println("aaaaaa");
return null;
}
}, new Supplier<Object>() {
@Override
public Object get() {
System.out.println("bbbbbbb");
return null;
}
});

Supplier<T> synchronizedSupplier(Supplier<T> delegate) 线程安全

 Supplier supplier= Suppliers.synchronizedSupplier(new Supplier() {
@Override
public Object get() {
return null;
}
});

guava(二) Equivalence & Supplier的更多相关文章

  1. Guava cacha 机制及源码分析

    1.ehcahce 什么时候用比较好:2.问题:当有个消息的key不在guava里面的话,如果大量的消息过来,会同时请求数据库吗?还是只有一个请求数据库,其他的等待第一个把数据从DB加载到Guava中 ...

  2. java8新特性——四大内置核心函数式接口

    在前面几篇简单介绍了一些Lambda表达式得好处与语法,我们知道使用Lambda表达式是需要使用函数式接口得,那么,岂不是在我们开发过程中需要定义许多函数式接口,其实不然,java8其实已经为我们定义 ...

  3. Java8的新特性--函数式接口

    目录 函数式接口 什么是函数式接口 函数式接口的使用 Java8内置的四大核心函数式接口 一.Consumer:消费型接口(void accept(T t)) 二.Supplier:供给型接口(T g ...

  4. Guava Supplier实例

    今天想讲一下Guava Suppliers的几点用法.Guava Suppliers的主要功能是创建包裹的单例对象,通过get方法可以获取对象的值.每次获取的对象都为同一个对象,但你和单例模式有所区别 ...

  5. guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用

    guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用 1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection ...

  6. guava学习--Supplier Suppliers

    转载:http://www.cnblogs.com/jun-ma/p/4850591.html Guava Suppliers的主要功能是创建包裹的单例对象,通过get方法可以获取对象的值.每次获取的 ...

  7. Spring Boot 揭秘与实战(二) 数据缓存篇 - Guava Cache

    文章目录 1. Guava Cache 集成 2. 个性化配置 3. 源代码 本文,讲解 Spring Boot 如何集成 Guava Cache,实现缓存. 在阅读「Spring Boot 揭秘与实 ...

  8. Guava的Supplier实现单例

    1.函数式编程: 2.第一次get时才会初始化: 3.可以实现单例或缓存. package suppliers; import com.google.common.base.Supplier; imp ...

  9. guava快速入门(二)

    Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] .缓存 [caching] .原生类型支持 [primitives support] ...

随机推荐

  1. IDEA设置方法参数列表类型自动提示

    默认情况下,IDEA的提示不够完全,可以通过以下设置,将提示功能打开的更完善. 效果如下面俩图所示

  2. Kubernetes Pod 镜像拉取策略

    Kubernetes Pod 镜像拉取策略 官方文档:https://kubernetes.io/docs/concepts/containers/images/ • IfNotPresent:默认值 ...

  3. Nginx的相关问题

    1.什么是Nginx的虚拟主机? 答:虚拟主机是一种特殊的软硬件技术,它可以将网络上的每一台计算机分成多个虚拟主机,每个虚拟主机可以独立对外提供www服务,这样就可以实现一台主机对外提供多个web服务 ...

  4. 单独KafkaConsumer实例and多worker线程。

    1.单独KafkaConsumer实例and多worker线程.将获取的消息和消息的处理解耦,将消息的处理放入单独的工作者线程中,即工作线程中,同时维护一个或者若各干consumer实例执行消息获取任 ...

  5. 海关单一窗口程序出现网络/MQ问题后自动修复处理

    单一窗口切换了2年多了,由于RabbitMQ或者网络的不稳定,或者升级或者网络调整,等等诸多问题导致了海关单一窗口程序会不定期的出现文件及回执自动处理的作业停止的问题. 最近终于想明白了,把日志监控起 ...

  6. Python学习笔记之unittest测试类

    11-3 雇员:编写一个名为Employee 的类,其方法__init__()接受名.姓和年薪,并将它们都存储在属性中.编写一个名为give_raise()的方法,它默认将年薪增加5000美元,但也能 ...

  7. android studio学习----gradle基础

    Gradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的内部领域特定(DSL)语言. 安装Gradle 在And ...

  8. 读oc52个有效方法的总结

    这本书主要是对于oc语言的代码优化和一些我们不知道的精华.全书分为7章节 1.熟悉oc语言 第一条:了解oc的语言起源 主要是对于oc语言的起源介绍和oc语言的特点进行概括,oc语言主要是使用消息结构 ...

  9. Jmeter对服务器进行压力测试

    一.插件准备 下载地址:https://jmeter-plugins.org/downloads/all/ 1.下载插件管理: 2.将管理插件放到jmeter/../ext文件夹中 3.在插件管理中搜 ...

  10. [linux] 多进程和多线程

    1.在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段.堆栈段和数据段,这是一种”昂贵”的多任务工作方式.2.而运行于一个进程中的多个线程,它们彼此之间使 ...