Guava包学习---Lists
Guava包是我最近项目中同事推荐使用的,是google推出的库。里面的功能非常多,包括了集合、缓存、原生类型支持、并发库、通用注解、字符串处理、IO等。我们项目中使用到了guava依赖,但是实际上只是用了其中很小一部分功能,比如集合的声明和处理以及函数式风格等。
废话少说,上图先:
我们会发现里面太多的东西,基本上全部加起来得有数百个上千的类了,但是所经常使用的其实就几十个类。其实可以在项目中建立common-utils包专门抄一部分guava的类过去,而不必全部将guava依赖进来。
工作中使用最多的莫过于List、set、map、string,I/O了,先看Lists吧。
@GwtCompatible(emulated = true)
public final class Lists {}
这个是guava中Lists工具的声明,这个GwtCompatible的注解有两个参数,一个是serializable 一个是imulated,都是boolean的值,表示是否需要支持序列化、是否仿真(其实就是是否和JVM的默认实现不一致)。guava中的注释写的非常详细,方法也非常多,但实际上我经常用到的只不过是某些list的声明和一些将list拆分的功能,所以我就只关心那几个方法了。上图看下guava lists类的方法:
其实里面很多方法就是使用泛型简化平时手工去敲的操作。有些方法在jdk1.7及以后已经应该变成deprecated。
@GwtCompatible(serializable = true)
public static <E> ArrayList<E> newArrayList(Iterable<? extends E> elements) {
checkNotNull(elements); // for GWT
// Let ArrayList's sizing logic work, if possible
return (elements instanceof Collection)
? new ArrayList<E>(Collections2.cast(elements))
: newArrayList(elements.iterator());
}
Lists中newArrayList和newLinkedList等有好几个重载方法,其实就是使用泛型去简化一些工作。可能有人疑问我用Lists.newArrayList(xxx)和直接new ArrayList<?>()有什么区别,其实就是省点打字的功夫。比如你创建一个List<Map<String,Map<String,Object>> 这样子的list,如果你要用new的话得还得费很大劲去敲键盘,其实用guava去声明只需要使用重载方法就行了:
List<Map<String,Map<String,Object>>> list = Lists.newArrayList();
其实后面的创建的LinkedList、copyonwriteArrayList等等如出一辙,就不再多看。
还有一个比较有用的方法是拆分list:
public static <T> List<List<T>> partition(List<T> list, int size) {
checkNotNull(list);
checkArgument(size > 0);
return (list instanceof RandomAccess)
? new RandomAccessPartition<T>(list, size)
: new Partition<T>(list, size);
}
比如当你需要请求别人的API传入参数时对方的入参数量有限制,可以先拆分然后顺序请求获得结果。
RandomAccess意思是加快访问速度,不保证顺序但是可以让所有元素都常量时间拿到。下面列出Partition的详细代码:
private static class Partition<T> extends AbstractList<List<T>> {
final List<T> list;
final int size; Partition(List<T> list, int size) {
this.list = list;
this.size = size;
} @Override
public List<T> get(int index) {
checkElementIndex(index, size());
int start = index * size;
int end = Math.min(start + size, list.size());
return list.subList(start, end);
} @Override
public int size() {
return IntMath.divide(list.size(), size, RoundingMode.CEILING);
} @Override
public boolean isEmpty() {
return list.isEmpty();
}
}
也就是当你get的时候,它去进行subList操作。
接下来是一些很小众的功能了:
@Beta
public static ImmutableList<Character> charactersOf(String string) {
return new StringAsImmutableList(checkNotNull(string));
}
获得一个String的不可变Char。
@Beta
public static List<Character> charactersOf(CharSequence sequence) {
return new CharSequenceAsList(checkNotNull(sequence));
}
获得一个charsquence的list
@CheckReturnValue
public static <T> List<T> reverse(List<T> list) {
if (list instanceof ImmutableList) {
return ((ImmutableList<T>) list).reverse();
} else if (list instanceof ReverseList) {
return ((ReverseList<T>) list).getForwardList();
} else if (list instanceof RandomAccess) {
return new RandomAccessReverseList<T>(list);
} else {
return new ReverseList<T>(list);
}
}
反转一个list。
剩下还有很多重写方法和static的protected的方法,但是都很常见。接下来去看一下Sets类吧。
Guava包学习---Lists的更多相关文章
- Guava包学习--EventBus
之前没用过这个EventBus,然后看了一下EventBus的源码也没看明白,(-__-)b.反正大概就是弄一个优雅的方式实现了观察者模式吧.慢慢深入学习一下. 观察者模式其实就是生产者消费者的一个变 ...
- Guava包学习---I/O
Guava的I/O平时使用不太多,目前项目原因导致基本上只有在自己写一些文本处理小工具才用得到.但是I/O始终是程序猿最常遇到的需求和面试必问的知识点之一.同时Guava的I/O主要面向是时JDK5和 ...
- Guava包学习-Cache
这段时间用到了ehcache和memcache,memcache只用来配置在tomcat中做负载均衡过程中的session共享,然后ehcache用来存放需要的程序中缓存. Guava中的Cache和 ...
- Guava包学习-Multimap
它和上一章的MultiSet的继承结果很相似,只不过在上层的接口是Multimap不是Multiset. Multimap的特点其实就是可以包含有几个重复Key的value,你可以put进入多个不同v ...
- Guava包学习---Maps
Maps包方法列表: 还是泛型创建Map: public static <K, V> HashMap<K, V> newHashMap() { return new HashM ...
- Guava包学习---Sets
Sets包的内容和上一篇中的Lists没有什么大的区别,里面有些细节可以看一下: 开始的创建newHashSet()的各个重载方法.newConcurrentHashSet()的重载方法.newTre ...
- Guava包学习--Hash
我们HashMap会有一个rehash的过程,为什么呢?因为java内建的散列码被限制为32位,而且没有分离散列算法和所作用的数据,所以替代算法比较难做.我们使用HashMap的时候它自身有一个reh ...
- Guava包学习---Bimap
Bimap也是Guava中提供的新集合类,别名叫做双向map,就是key->value,value->key,也就是你可以通过key定位value,也可以用value定位key. 这个场景 ...
- Guava包学习--Multiset
Multiset之前倒是没用过,后来看了下还挺有用,其实它就是支持重复元素的HashSet,相当于list+set的集合,综合了两种集合的优点. 它扩展了Collection: @GwtCompati ...
随机推荐
- RabbitMQ入门教程系列
https://blog.csdn.net/column/details/18247.html
- API ,批量添加
添加引用:cors using system.web.http.cors API添加这句话: [EnableCors("*", "*", &qu ...
- C# 之文件拖拽和pixturBox缩放与拖拽
文件拖拽: 效果:将一个文件拖拽到窗体的某个控件时,将该控件的路径显示在该控件上,只要拿到了路径自然可以读取文件中的内容了. 将一个控件的属性AllowDrop设置为true,然后添加DragDrop ...
- [javaSE] GUI(Action事件)
对自己定义的类规范化一下,事件和图形化组件分离出来 定义一个类FrameDemo 定义成员属性Frame frame 定义成员属性Botton 定义构造方法FrameDemo() 定义初始化方法ini ...
- 折半插入排序-ACM题
第一种实现方式:(本人一开始对cin的使用不是很熟悉,看了一些人得博客详解后才有了第一种方式的实现,自己都被惊讶到了so easy:题目在下面) // // main.cpp // BinaryIns ...
- JAVA基础之——版本控制系统之git
1 版本控制系统是什么 当多人协作开发一套产品时,需要能够保证代码都能够共用,那么版本控制系统就应运而生. 2 GIT 当前用的比较多的是svn和git,本文以git为例进行讲解. git诞生于200 ...
- python学习之老男孩python全栈第九期_day021知识点总结——包、异常处理
一. 包 # 把解决一类问题的模块放在同一个文件夹里 -- 包 # 创建目录代码# import os# os.makedirs('glance/api')# os.makedirs('glance/ ...
- alembic 数据库管理
alembic简介 Alembic是SQLAlchemy作者编写的Python数据库迁移工具 安装 pip install alembic alembic 操作流程 初始化 alembic init ...
- Effective C++ Notes
Item 07 : 为多态基类声明virtual析构函数 #include <iostream> using namespace std; class Base { public: Bas ...
- C# winfrom提示框,点击则不显示,不点击则提示输入内容
先看下效果图,初次进来是界面左边的效果,点击请输入账号,清除内容,可以直接输入,右边图 以下代码是失去焦点的,一定要把控件的属性TabStop 改 ...