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. VS Code插件配置

    常用 VS Code 插件: Auto Import 有了这个插件,就不需要再手动引入文件了.如果是基于组件的项目,直接输入组件名插件会自动处理 imported. ** Add jsdoc comm ...

  2. html 的 crossorigin 属性

    添加这个属性, 并且服务器允许跨域后,会得到精确的报错信息. 添加这个属性,但服务器不允许跨域,就会被同源策略阻止加载资源. 不添加这个属性,只能知道报错,不知道具体信息. https://www.j ...

  3. Web API系列(三) 异常处理

    在上一篇教程中我为大家介绍了Web API中Filter的开发使用,其中讲到ExceptionFilter时留了一个坑:ExceptionFilter只能截获并处理Action执行过程中发生的异常,在 ...

  4. 20165306 Exp2 后门原理与实践

    20165306 Exp2 后门原理与实践 实验内容 (1)使用netcat获取主机操作Shell,cron启动 (2)使用socat获取主机操作Shell, 任务计划启动 (3)使用MSF mete ...

  5. 基于vue 、vue-router 、firebase的todolist小项目

    第一次写博客,都不知道改怎么写的好. 本着一颗学习的心,也希望一段时间后再回来在看看自己写的代码,会不会让自己有种不忍直视的念头 *-* 还是先上图吧~ 这是首页,主要是展示所有的列表页面,可以通过输 ...

  6. Project Euler 75: Singular integer right triangles

    题目链接 思路: 勾股数组,又称毕达格拉斯三元组. 公式:a = s*t b = (s^2 - t^2) / 2 c = (s^2 + t^2) / 2 s > t >=1 且为互质的奇数 ...

  7. JMETER-01

    jmter安装 1.Linxu安装: 步骤:下载JMeter包-->解压包-->赋权限-->配置环境变量-->测试服务 1.下载:wget http://mirrors.hus ...

  8. jmeter 上传附件 如图片

    1.要勾选 Use multipart/form-data for POST,否则request中将不包含上传的文件 2.MIME类型为application/octet-stream 图如下:对应 ...

  9. 客户端与服务器之间通信收不到信息——readLine()

    写服务器端和客户端之间通信,结果一直读取不到信息,在https://blog.csdn.net/yiluxiangqian7715/article/details/50173573 上找到了原因:使用 ...

  10. Linux中一个快速查找文件和目录的命令

    功能介绍: locate命令其实是find -name的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/locatedb,值得注意的是:版本不同,会有所不 ...