Guava 18.0到22.0 Equivalence发生了较大的变化,这里我们先不可考虑Equivalence 新实现的那个接口,首先看一个测试demo:
import java.util.ArrayList;
import java.util.List; public class WapperTest {
public static void main(String[] args) {
Equivalence<Object> equivalence=Equivalence.equals();
System.out.println("equals仅仅是做了一个代理");
System.out.println(equivalence.equivalent("aaa","bbb"));
System.out.println(equivalence.equivalent("aaa","aaa"));
Equivalence<String> stringEquivalence=new Equivalence<String>() {
@Override
protected boolean doEquivalent(String a, String b) {
return a.length()==b.length();
} @Override
protected int doHash(String s) {
return s.hashCode();
}
};
System.out.println("自己编写的Equivalent");
System.out.println(stringEquivalence.equivalent("qaa1","ssa1"));
System.out.println(stringEquivalence.equivalent("oooo","ss"));
Equivalence.Wrapper<String> stringWrapper1=stringEquivalence.wrap("aaa");
System.out.println("Wapper错误使用");
System.out.println(stringWrapper1.equals("saa"));
Equivalence.Wrapper<String> stringWrapper2=stringEquivalence.wrap("saa");
System.out.println("Wapper正确使用"); //注意Wapper只有用在和另一个Wapper比较时才有意义,目前还不知道它的使用场景。
System.out.println(stringWrapper1.equals(stringWrapper2));
System.out.println("匹配两个可迭代对象");
List<String> iteratorA=new ArrayList<>();
iteratorA.add("aaa");
iteratorA.add("aaa");
List<String> iteratorB=new ArrayList<>();
iteratorB.add("bbb");
iteratorB.add("aaa");
Equivalence<Iterable<String>> iterableEquivalence=stringEquivalence.pairwise();
System.out.println(iterableEquivalence.equivalent(iteratorA,iteratorB));
//System.out.println(stringEquivalence.equivalent(null,null)); }
}

输出结果:

equals仅仅是做了一个代理
false
true
自己编写的Equivalent
true
false
Wapper错误使用
false
Wapper正确使用
true
匹配两个可迭代对象
true

 Equivalence是用来判断两个对象是否相等,在其中我们可以定制自己的判断逻辑,看一下源码,部分代码略去,本人水平很烂

public abstract class Equivalence<T>  一个抽象类,用于判断两个对象是否相等。equivalent相等的

protected Equivalence() {}   构造函数类型为protected,这是Guava里模板方法的模版类的常见写法(模版方法是常见的设计模式)
public final boolean equivalent(@Nullable T a, @Nullable T b) {   如果两个对象相等,返回true,否则返回false; 核心函数。如果a==null&&b==null,返回true;同一在模板方法中处理空值等特殊情况,简化子类逻辑编写,这是我们写工具类时一个很好的参考。
if (a == b) {
return true;
}
if (a == null || b == null) {
return false;
}
return doEquivalent(a, b); 否则就调用我们自己定制的判断方法
}
protected abstract boolean doEquivalent(T a, T b);   将判断的控制权交给具体的实现子类。很灵活。
public final int hash(@Nullable T t) {         返回一个对象的hashCode,如果为空,返回0;不为空的话,我们也可以定制自己的hash值。核心函数
if (t == null) {
return 0;
}
return doHash(t);
}
protected abstract int doHash(T t);                    同样将具体实现交给实现类去做,和上个方法一样,在模版方法做了判空等操作,简化了子类代码的编写复杂度。
public static Equivalence<Object> equals() { 这个函数以及下个函数很简单,这个是调用a.equals(b)判断两个元素是否相等,用类的hashCode()返回对象的hash值 return Equals.INSTANCE;}
public static Equivalence<Object> identity() {   只有a==b是两个元素才是相等的。hash调用的是System.identityHashCode(o),不知道什么鬼

 return Identity.INSTANCE; }
public final <S extends T> Wrapper<S> wrap(@Nullable S reference)   创造一个Wapper,详情请看另一篇博客,只不过没啥意义,很简单
public final <S extends T> Equivalence<Iterable<S>> pairwise()  返回一个Equivalence<Iterable<s>>,用于匹配两个可迭代对象是否相等,对于可迭代对象推荐
用这种方法。
public final <F> Equivalence<F> onResultOf(Function<F, ? extends T> function) 不知道怎么解释。把核心代码贴出来,很简单
@Override
protected boolean doEquivalent(F a, F b) { 我想他的应用场景应该是和pairwise,结合使用,在处理前对数据进行一定的处理。
return resultEquivalence.equivalent(function.apply(a), function.apply(b));
}
@Override
protected int doHash(F a) {
return resultEquivalence.hash(function.apply(a));
}

Base包equivalent的更多相关文章

  1. dplyr包--数据操作与清洗

    1.简介 在我们数据分析的实际应用中,我们可能会花费大量的时间在数据清洗上,而如果使用 R 里面自带的一些函数(base 包的 transform 等),可能会觉得力不从心,或者不是很人性化.好在我们 ...

  2. R----stringr包介绍学习

    1. stringr介绍 stringr包被定义为一致的.简单易用的字符串工具集.所有的函数和参数定义都具有一致性,比如,用相同的方法进行NA处理和0长度的向量处理. 字符串处理虽然不是R语言中最主要 ...

  3. R----dplyr包介绍学习

    dplyr包:plyr包的替代者,专门面对数据框,将ddplyr转变为更易用的接口 %>%来自dplyr包的管道函数,其作用是将前一步的结果直接传参给下一步的函数,从而省略了中间的赋值步骤,可以 ...

  4. linux 下安装开发组件包

    最初安装redhat 时, 系统自己装的,只安装了base 包,在开发过程中,需要不停的安装某个需求包,   图省事,安装光盘下的开发组件包: 在安装光盘下,,,用命令: yum grouplist ...

  5. R︱并行计算以及提高运算效率的方式(parallel包、clusterExport函数、SupR包简介)

    要学的东西太多,无笔记不能学~~ 欢迎关注公众号,一起分享学习笔记,记录每一颗"贝壳"~ --------------------------- 终于开始攻克并行这一块了,有点小兴 ...

  6. R语言︱常用统计方法包+机器学习包(名称、简介)

    一.一些函数包大汇总 转载于:http://www.dataguru.cn/thread-116761-1-1.html 时间上有点过期,下面的资料供大家参考基本的R包已经实现了传统多元统计的很多功能 ...

  7. R语言学习 第九篇:plyr包

    在数据分析中,整理数据的本质可以归纳为:对数据进行分割(Split),然后应用(Apply)某些处理函数,最后将结果重新组合(Combine)成所需的格式返回,简单描述为:Split - Apply ...

  8. R语言学习 第十篇:包

    包(Package)是实现特定功能的.预先写好的代码库(library),通俗地说,包是含有函数.数据等的功能模块.R拥有大量的软件包,许多包都是由某一领域的专家编写的,但并不是所有的包都有很高的质量 ...

  9. ML—R常用多元统计分析包(持续更新中……)

    基本的R包已经实现了传统多元统计的很多功能,然而CRNA的许多其它包提供了更深入的多元统计方法,下面要综述的包主要分为以下几个部分: 1) 多元数据可视化(Visualising multivaria ...

随机推荐

  1. eclipse如何忽略、过滤不需要提交到svn的文件和目录

    1.进入navigator视图 2.选中不需要提交到svn的目录或者文件,右键team->添加至svn:ignore 3.如图:

  2. 正则表达式,js里的正则应用

    我爱撸码,撸码使我感到快乐!大家好,我是Counter.好吧已经到凌晨了,其实还是蛮困的,体力不支了,想了想还是把今天任务结束掉吧,为期5天,又重新把JavaScript以及jQuery给大致过了一遍 ...

  3. 关于matplotlib绘制直方图偏移的问题

    在使用pyplot绘制直方图的时候我发现了一个问题,在给函数.hist()传参的时候,如果传入的组数不是刚刚好(就是说这个组数如果是使用(最大值-最小值)/组距计算出来,而这个数字不是整除得来而是取整 ...

  4. python读Excel

    import xlrd def open_excel(fileName="TransInfo.xlsx"): try: fileHandler = xlrd.open_workbo ...

  5. [转载]使用IEDriverServer.exe驱动IE11,实现自动化测试

    转自:https://www.cnblogs.com/feiquan/p/8531618.html 下载地址: http://dl.pconline.com.cn/download/771640-1. ...

  6. [转载]linux下网卡漂移导致网络不可用

    转自:https://blog.csdn.net/hyatsz/article/details/47690993 linux下网卡漂移导致网络不可用 2015年08月16日 00:48:50 hyat ...

  7. vue中import引入模块路径中@符号是什么意思

    在编写vue文件中引入模块 import model from "@/common/model"; 这里路径前面的“@”符号表示什么意思? resolve: { // 自动补全的扩 ...

  8. 跨域获取后台日期-ASP

    最近所有的计划都被打乱,生活节奏也有些控制不住,所以在自己还算清醒的时候,把之前一个小功能写下来,对其它人也有些帮助. 需求前景:需要用AJAX跨域获取后台服务器日期. 1.分析需求: 在这个需求中, ...

  9. centos7 基础命令

    一: linux基础 (1) 查看服务器的IP信息 ip add showifconfig (2) 操作网卡命令(重启网络和启用网卡) systemctl restart networksystemc ...

  10. Web API学习笔记(Python实现)

    参考指南: Web API入门指南 http://www.cnblogs.com/guyun/p/4589115.html 用Python写一个简单的Web框架 http://www.cnblogs. ...