Guava学习记录
来源:互联网 发布:阿儿法营编程学校 编辑:程序博客网 时间:2024/06/05 18:51
Guava学习记录
1.Objects.equal(),不用对它们进行null检查
Objects.equal("a", "a"); // returns trueObjects.equal(null, "a"); // returns falseObjects.equal("a", null); // returns falseObjects.equal(null, null); // returns true
2.有关实现比较器,ComparisonChain执行一种懒比较:它执行比较操作直至发现非零的结果,在那之后的比较输入将被忽略
public int compareTo(Foo that) { return ComparisonChain.start() .compare(this.aString, that.aString) .compare(this.anInt, that.anInt) .compare(this.anEnum, that.anEnum, Ordering.natural().nullsLast()) .result();}
注: compare(Comparable<?> left, Comparable<?> right) && compare(T left, T right, Comparator comparator) 最后的result返回比较结果,若都相等返回0
3.流畅风格比较器,Ordering是Guava流畅风格比较器Comparator的实现,它可以用来为构建复杂的比较器,以完成集合排序的功能。
Ordering<Foo> ordering = Ordering.natural().nullsFirst().onResultOf(new Function<Foo, String>() { public String apply(Foo foo) { return foo.sortedBy; }});
当阅读链式调用产生的排序器时,应该从后往前读
Ordering排序器的应用方法
集合(Collections)
1.不可变集合(不支持null值),虽然JDK也提供了Collections.unmodifiableXXX方法把集合包装为不可变形式,但是guava的不可变集合进行了改良
构建方法
1. copyOf方法,如ImmutableSet.copyOf(set);2. of方法,如ImmutableSet.of(“a”, “b”, “c”)或 ImmutableMap.of(“a”, 1, “b”, 2);3. Builder工具 public static final ImmutableSet<Color> GOOGLE_COLORS = ImmutableSet.<Color>builder() .addAll(WEBSAFE_COLORS) .add(new Color(0, 191, 255)) .build();
关联可变集合和不可变集合,如下
2.Multiset:没有元素顺序限制的ArrayList,Map,键为元素,值为计数
3.Multimap:把一个键映射到多个值,如a -> 1 a -> 2 a ->4 b -> 3 c -> 5,Multimap.get(key)以集合形式返回键所对应的值视图
4.BiMap:可以用 inverse()反转BiMap的键值映射,保证值是唯一的,因此 values()返回Set而不是普通的Collection
5.Table: 实现多个键做索引 ,用Table<R, C, V>表现Map<R, Map<C, V>>
6.集合工具类:java.util.Collections是JDK提供的集合工具类,guava沿用这一方式,提供了更多好用的工具类
List<String> theseElements = Lists.newArrayList("alpha", "beta", "gamma");构造新的泛型集合去掉new重复声明类型,用工厂方法模式,方便在初始化时指定起始元素
有关Sets提供很多标准的集合运算方法
具体工具类方法,需要去查看源码方法,针对具体需求使用
缓存(Caches)
Guava cache和ConcurrentMap很相似,最基本的区别是ConcurrentMap会一直保存所有添加的元素,直到显式的移除。
Guava cache是单机本地缓存
1.CacheLoader:
LoadingCache<Integer, String> cache = CacheBuilder.newBuilder() .maximumSize(100) .build( new CacheLoader<Integer, String>() { @Override public String load(Integer key) { return key + "sss"; } } );//cache为0System.out.println(cache);//有则直接返回,没有则添加缓存后返回System.out.println(cache.getUnchecked(1));//cache为1System.out.println(cache);
2.Callable:get(K, Callable)方法,返回缓存中相应的值,或者用给定的Callable运算并把结果加入到缓存中,这个方法简便地实现了模式”如果有缓存则返回;否则运算、缓存、然后返回”
3.cache.put(key, value)方法 显式的直接插入修改缓存,Cache.invalidate(key)方法 显式的删除
4.缓存回收:
基于容量回收
定时回收:定时回收周期性地在写操作中执行,偶尔在读操作中执行
基于引用回收
并发(Concurrency)
1.ListenableFuture接口继承JDK concurrent包下的Future接口
传统JDK中的Future通过异步的方式计算返回结果:在多线程运算中可能或者可能在没有结束返回结果,Future是运行中的多线程的一个引用句柄,确保在服务执行返回一个Result,ListenableFuture可以允许你注册回调方法(callbacks),在运算(多线程执行)完成的时候进行调用, 或者在运算(多线程执行)完成后立即执行。这样简单的改进,使得可以明显的支持更多的操作,这样的功能在JDK concurrent中的Future是不支持的
2.使用ListenableFuture 最重要的理由是它可以进行一系列的复杂链式的异步操作
字符串处理(Strings)
1.连接器Joiner:字符串中有null,处理起来更方便
Joiner joiner = Joiner.on("; ").skipNulls();Joiner joiner = Joiner.on("; ").useForNull();return joiner.join("Harry", null, "Ron", "Hermione");
连接对象类型,将会调用toString的方法连接
2.拆分器Splitter:內建的String.split悄悄丢弃了尾部的分隔符(即”b,”按照”,”拆分,只得到b而忽略掉空字符串),Splitter实例用法如下
Splitter.on(',').trimResults() .omitEmptyStrings() .split("foo,bar,, qux" );
3.字符匹配器CharMatcher:是对StringUtil类的升级
4.字符集Charsets:使用bytes = string.getBytes(Charsets.UTF_8)这种方式,而不是通过名称获取字符集实例
5.大小写格式CaseFormat:用于编程语言的命名规范,例子如下
CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "CONSTANT_NAME")); // returns "constantName"
原生类型(Primitives)
Java的原生类型就是指基本类型:byte、short、int、long、float、double、char和boolean
区间(Ranges)
Guava用更紧凑的方法表示范围
1.构建区间
Range.closed("left", "right"); //字典序在"left"和"right"之间的字符串,闭区间Range.lessThan(4.0); //严格小于4.0的double值...
2.区间运算,包括查询,关系,相连,交集,跨区间
3.有关根据区间创建离散域
I/O
字节流指的是InputStream或OutputStream,字符流指的是Reader 或Writer,guava相应的工具方法分别在ByteStreams 和CharStreams中
1.数据源包括File && Url,源是可读的,汇是可写的
2.源与汇的实现应该在每次openStream()方法被调用时都创建一个新的流。始终创建新的流可以让源或汇管理流的整个生命周期,并且让多次调用openStream()返回的流都是可用的。此外,如果你在创建源或汇之前创建了流,你不得不在异常的时候自己保证关闭流,这压根就违背了发挥源与汇API优点的初衷。
3.使用源与汇
//Read the lines of a UTF-8 text fileImmutableList<String> lines = Files.asCharSource(file, Charsets.UTF_8).readLines();//Count distinct word occurrences in a fileMultiset<String> wordOccurrences = HashMultiset.create( Splitter.on(CharMatcher.WHITESPACE) .trimResults() .omitEmptyStrings() .split(Files.asCharSource(file, Charsets.UTF_8).read()));//SHA-1 a fileHashCode hash = Files.asByteSource(file).hash(Hashing.sha1());//Copy the data from a URL to a fileResources.asByteSource(url).copyTo(Files.asByteSink(file));
散列(Hash)
1.散列包的组成:HashFunction,Hasher,Funnel,HashCode
2.布鲁姆过滤器(BloomFilter):检测某个对象是一定不在过滤器中,还是可能已经添加到过滤器
3.Hashing类,提供的函数如下
事件总线(EventBus)
Java的进程内事件分发都是通过发布者和订阅者之间的显式注册实现的。设计EventBus就是为了取代这种显示注册方式,使组件间有了更好的解耦
1.事件监听者(Listeners),按监听特定事件;把事件监听者注册到事件发生者;按事件超类监听;检测没有监听者的事件
2.事件生产者(Producers),管理和追踪监听者;向监听者分发事件
范例代码
// Class is typically registered by the container.class EventBusChangeRecorder { @Subscribe public void recordCustomerChange(ChangeEvent e) { recordChange(e.getChange()); }}// somewhere during initializationeventBus.register(new EventBusChangeRecorder());// much laterpublic void changeCustomer() { ChangeEvent event = getChangeEvent(); eventBus.post(event);}
数学运算(Math)
1.整数运算,包括IntMath,LongMath,BigIntegerMath,包括有检查溢出的运算
2.实数运算
3.浮点数运算 DoubleMath
范例代码
int logFloor = LongMath.log2(n, FLOOR);int mustNotOverflow = IntMath.checkedMultiply(x, y);long quotient = LongMath.divide(knownMultipleOfThree, 3, RoundingMode.UNNECESSARY); // fail fast on non-multiple of 3BigInteger nearestInteger = DoubleMath.roundToBigInteger(d, RoundingMode.HALF_EVEN);BigInteger sideLength = BigIntegerMath.sqrt(area, CEILING);
参考文章 http://ifeve.com/google-guava/
- guava学习资料记录
- Guava学习记录
- Guava学习
- guava学习
- Guava 学习
- guava 学习
- Guava学习笔记:Guava cache
- Guava学习笔记:Guava cache
- Guava学习笔记:Guava cache
- Guava学习笔记:Guava cache
- Guava学习笔记:Guava cache
- Guava学习笔记:Guava cache
- Guava学习笔记:Guava cache
- Guava学习笔记:Guava cache
- Guava线程池踩坑记录
- guava使用记录
- Guava LoadingCache使用记录
- Guava学习笔记:Guava新增集合类型
- OpenCV打开 内存buf中的图片
- 快速幂取模 (位优化)
- 感悟
- 二叉树--实现二叉树的前序/中序/后序非递归遍历。
- Libevent源码分析-----连接监听器evconnlistener
- Guava学习记录
- NodeVisitor
- js获取当前时间并存到数据中
- C#关于委托的那些事儿
- VC++ 中LoadLibrary的路径问题
- Comparing system calls and C libraries
- 棋盘问题
- BZOJ 3065 带插入区间K小值
- Shell 定时5分钟一次监控Tomcat状态,自动重启