guava(二) Equivalence & Supplier
一、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的更多相关文章
- Guava cacha 机制及源码分析
1.ehcahce 什么时候用比较好:2.问题:当有个消息的key不在guava里面的话,如果大量的消息过来,会同时请求数据库吗?还是只有一个请求数据库,其他的等待第一个把数据从DB加载到Guava中 ...
- java8新特性——四大内置核心函数式接口
在前面几篇简单介绍了一些Lambda表达式得好处与语法,我们知道使用Lambda表达式是需要使用函数式接口得,那么,岂不是在我们开发过程中需要定义许多函数式接口,其实不然,java8其实已经为我们定义 ...
- Java8的新特性--函数式接口
目录 函数式接口 什么是函数式接口 函数式接口的使用 Java8内置的四大核心函数式接口 一.Consumer:消费型接口(void accept(T t)) 二.Supplier:供给型接口(T g ...
- Guava Supplier实例
今天想讲一下Guava Suppliers的几点用法.Guava Suppliers的主要功能是创建包裹的单例对象,通过get方法可以获取对象的值.每次获取的对象都为同一个对象,但你和单例模式有所区别 ...
- guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用
guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用 1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection ...
- guava学习--Supplier Suppliers
转载:http://www.cnblogs.com/jun-ma/p/4850591.html Guava Suppliers的主要功能是创建包裹的单例对象,通过get方法可以获取对象的值.每次获取的 ...
- Spring Boot 揭秘与实战(二) 数据缓存篇 - Guava Cache
文章目录 1. Guava Cache 集成 2. 个性化配置 3. 源代码 本文,讲解 Spring Boot 如何集成 Guava Cache,实现缓存. 在阅读「Spring Boot 揭秘与实 ...
- Guava的Supplier实现单例
1.函数式编程: 2.第一次get时才会初始化: 3.可以实现单例或缓存. package suppliers; import com.google.common.base.Supplier; imp ...
- guava快速入门(二)
Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] .缓存 [caching] .原生类型支持 [primitives support] ...
随机推荐
- WPF 3D相机基本坐标简介
基本概念 WPF中3D空间基本坐标系是右手坐标系. WPF中3D空间的原点是(0,0,0) Position: 这个参数用来表示相机在空间内的坐标.参数是(X,Y,Z).当修改相机的这个参数时,这个坐 ...
- 【UOJ#308】【UNR#2】UOJ拯救计划
[UOJ#308][UNR#2]UOJ拯救计划 题面 UOJ 题解 如果模数很奇怪,我们可以插值一下,设\(f[i]\)表示用了\(i\)种颜色的方案数. 然而模\(6\)这个东西很有意思,\(6=2 ...
- CSS3 transform 属性(2D,3D旋转)
一.语法 div{ transform:rotate(7deg); -ms-transform:rotate(7deg); /* IE 9 */ -moz-transform:rotate(7deg) ...
- Lucene BooleanQuery相关算法
BooleanQuery对两种不同查询场景执行不同的算法: 场景1: 所有的子句都必须满足,而且所有的子句里没有嵌套BooleanQuery. 例: a AND b AND c 上面语句表示要同时包含 ...
- placeholder和assign速度对比
在CPU上,使用variable和placeholder效果差不多 在GPU上,使用variable要比每次都传placeholder快得多3:2 使用GPU的瓶颈主要在于GPU和内存之间的复制操作 ...
- Java的 Annotation 新特性
对于软件程序的开发经过了三个发展过程: —— 将所有配置相关的内容直接写到代码之中 —— 将配置与代码程序独立,将程序运行的时候根据配置文件进行操作 —— 配置信息对用户透明且无用,将配置信息写回代码 ...
- 英语JASPERITE碧玉Jasperite单词
碧玉为一种含矿物质较多的和田玉,其中氧化铁和粘土矿物等含量可达20%以上,不透.微透或半透,颜色多呈暗红色.绿色或杂色. 中文名碧玉 外文名Jasper,Jasperite 别 称玛钠斯玉 类 别按颜 ...
- [b0011] windows 下 eclipse 开发 hdfs程序样例 (三)
目的: 学习windows 开发hadoop程序的配置. [b0007] windows 下 eclipse 开发 hdfs程序样例 太麻烦 [b0010] windows 下 eclipse 开发 ...
- Linux 信号量之Posix有名字的信号量
信号量(semaphore),也和互斥锁一样提供了线程间或者进程间的同步功能. 信号量有三种: Posix有名字的信号量 Posix基于内存的信号量 System V信号量 信号量比互斥锁高级,互斥锁 ...
- 201871010111-刘佳华《面向对象程序设计(java)》第四周学习总结
201871010111-刘佳华<面向对象程序设计(java)>第四周学习总结 实验时间 2019-9-20 第一部分:总结第四章理论知识 4.1:类与对象的概念. 类:类是构造对象的模板 ...