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 ...
随机推荐
- ipv4网络无访问权限
昨天折腾了一天这个网络受限问题,都没有得到解决,驱动精灵.电脑管家(我不用360).重置Winsock目录.网络重置.组策略控制台.重启路由器(学校的以太网,工作时间不好重置路由器)都用了个遍,一直都 ...
- linux下的nmap工具能干什么?
答:可以用来探测远程主机的操作系统类型,使用方法如下: nmap -A <ip address>
- USACO比赛题泛刷
随时可能弃坑. 因为不知道最近要刷啥所以就决定刷下usaco. 优先级排在学习新算法和打比赛之后. 仅有一句话题解.难一点的可能有代码. 优先级是Gold>Silver.Platinum刷不动. ...
- BMIP002协议介绍
比原BMIP002协议 概述 比原链技术社区最近提出了一套资产规范提议,该提议允许在issue类型的交易中实现标准资产token.该标准定义资产在链上的基本功能,以及发行人通过智能合约管理资产的规范. ...
- 2、Docker基础用法
容器镜像:https://hub.docker.com/ Docker架构图: https://ruby-china.org/topics/22004 Docker使用客户端-服务器(client- ...
- C语言-第6次作业
1.本章学习总结 1.1思维导图 1.2 本章学习体会 学习感受:先是接触到网络工程导论的建立文件的方式,觉得很方便很好用,而后直接从代码的层面建立文件,觉得很新奇,更加方便,随着大作业的一步一步升级 ...
- 【python 3】 字符串方法操作汇总
基础数据类型:str 1.1 字符串大小写转换 所有字母大写 : string.upper() 所有字母小写 : string. lower() 第一个单词的第一个字母大写,其他字母小写 : st ...
- js之作用域链到闭包
一.作用域 全局作用域和函数作用域(局部作用域). 一个变量的作用域就是源代码中定义这个变量的区域. 二.作用域链和闭包 全局变量只有一个(window,globel),全局环境下每一个函数都会形成一 ...
- _spellmod_aura_pct
属性光环 为玩家增加光环或降低属性 `aura`光环ID `auraType1` 配置属性('空','生命值','全属性','近战攻击强度','远程攻击强度','法术强度','治疗效果','施法速度' ...
- leecode第二百三十八题(除自身以外数组的乘积)
class Solution { public: vector<int> productExceptSelf(vector<int>& nums) { int len= ...