Base包equivalent
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的更多相关文章
- dplyr包--数据操作与清洗
		1.简介 在我们数据分析的实际应用中,我们可能会花费大量的时间在数据清洗上,而如果使用 R 里面自带的一些函数(base 包的 transform 等),可能会觉得力不从心,或者不是很人性化.好在我们 ... 
- R----stringr包介绍学习
		1. stringr介绍 stringr包被定义为一致的.简单易用的字符串工具集.所有的函数和参数定义都具有一致性,比如,用相同的方法进行NA处理和0长度的向量处理. 字符串处理虽然不是R语言中最主要 ... 
- R----dplyr包介绍学习
		dplyr包:plyr包的替代者,专门面对数据框,将ddplyr转变为更易用的接口 %>%来自dplyr包的管道函数,其作用是将前一步的结果直接传参给下一步的函数,从而省略了中间的赋值步骤,可以 ... 
- linux  下安装开发组件包
		最初安装redhat 时, 系统自己装的,只安装了base 包,在开发过程中,需要不停的安装某个需求包, 图省事,安装光盘下的开发组件包: 在安装光盘下,,,用命令: yum grouplist ... 
- R︱并行计算以及提高运算效率的方式(parallel包、clusterExport函数、SupR包简介)
		要学的东西太多,无笔记不能学~~ 欢迎关注公众号,一起分享学习笔记,记录每一颗"贝壳"~ --------------------------- 终于开始攻克并行这一块了,有点小兴 ... 
- R语言︱常用统计方法包+机器学习包(名称、简介)
		一.一些函数包大汇总 转载于:http://www.dataguru.cn/thread-116761-1-1.html 时间上有点过期,下面的资料供大家参考基本的R包已经实现了传统多元统计的很多功能 ... 
- R语言学习 第九篇:plyr包
		在数据分析中,整理数据的本质可以归纳为:对数据进行分割(Split),然后应用(Apply)某些处理函数,最后将结果重新组合(Combine)成所需的格式返回,简单描述为:Split - Apply ... 
- R语言学习 第十篇:包
		包(Package)是实现特定功能的.预先写好的代码库(library),通俗地说,包是含有函数.数据等的功能模块.R拥有大量的软件包,许多包都是由某一领域的专家编写的,但并不是所有的包都有很高的质量 ... 
- ML—R常用多元统计分析包(持续更新中……)
		基本的R包已经实现了传统多元统计的很多功能,然而CRNA的许多其它包提供了更深入的多元统计方法,下面要综述的包主要分为以下几个部分: 1) 多元数据可视化(Visualising multivaria ... 
随机推荐
- eclipse如何忽略、过滤不需要提交到svn的文件和目录
			1.进入navigator视图 2.选中不需要提交到svn的目录或者文件,右键team->添加至svn:ignore 3.如图: 
- 正则表达式,js里的正则应用
			我爱撸码,撸码使我感到快乐!大家好,我是Counter.好吧已经到凌晨了,其实还是蛮困的,体力不支了,想了想还是把今天任务结束掉吧,为期5天,又重新把JavaScript以及jQuery给大致过了一遍 ... 
- 关于matplotlib绘制直方图偏移的问题
			在使用pyplot绘制直方图的时候我发现了一个问题,在给函数.hist()传参的时候,如果传入的组数不是刚刚好(就是说这个组数如果是使用(最大值-最小值)/组距计算出来,而这个数字不是整除得来而是取整 ... 
- python读Excel
			import xlrd def open_excel(fileName="TransInfo.xlsx"): try: fileHandler = xlrd.open_workbo ... 
- [转载]使用IEDriverServer.exe驱动IE11,实现自动化测试
			转自:https://www.cnblogs.com/feiquan/p/8531618.html 下载地址: http://dl.pconline.com.cn/download/771640-1. ... 
- [转载]linux下网卡漂移导致网络不可用
			转自:https://blog.csdn.net/hyatsz/article/details/47690993 linux下网卡漂移导致网络不可用 2015年08月16日 00:48:50 hyat ... 
- vue中import引入模块路径中@符号是什么意思
			在编写vue文件中引入模块 import model from "@/common/model"; 这里路径前面的“@”符号表示什么意思? resolve: { // 自动补全的扩 ... 
- 跨域获取后台日期-ASP
			最近所有的计划都被打乱,生活节奏也有些控制不住,所以在自己还算清醒的时候,把之前一个小功能写下来,对其它人也有些帮助. 需求前景:需要用AJAX跨域获取后台服务器日期. 1.分析需求: 在这个需求中, ... 
- centos7 基础命令
			一: linux基础 (1) 查看服务器的IP信息 ip add showifconfig (2) 操作网卡命令(重启网络和启用网卡) systemctl restart networksystemc ... 
- Web API学习笔记(Python实现)
			参考指南: Web API入门指南 http://www.cnblogs.com/guyun/p/4589115.html 用Python写一个简单的Web框架 http://www.cnblogs. ... 
