使用guava变形数据结构
在java日常开发中,经常需要使用各种数据结构,在涉及到数据结构之间如何优雅的转换时,我们可以借助google的guava提供的相关功能来优雅的实现。以下记录一些开发中经常需要使用数据结构的变形,以便使用时方便查阅。
一般我们的数据结构中存储的为对象,以下举例先构造一个类,用来存放中不同的数据结构中。
class Person {
public String name;
public int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return MoreObjects.toStringHelper(this).omitNullValues()
.add("name", name)
.add("age", age)
.toString();
}
}
提供一个方法来构造一个对象list
public static Collection<Person> queryPersion(){
return Lists.newArrayList(
new Person("kang",30),
new Person("liu",25),
new Person("han",22)
);
}
//某个属性为null
public static List<Person> queryPersion2(){
return Lists.newArrayList(
new Person("kang",30),
new Person("liu",25),
new Person("han",22),
new Person(null,24)
);
}
- 获取一组对象中的某个属性,存入一个list
使用Lists.transform实现
List<Person> persons = queryPersion();
List<String> peopleNames = Lists.transform(persons, new Function<Person, String>() {
@Override
public String apply(Person person) {
return person.getName();
}
});
- 以优雅的方式过滤有null的值
Iterables.filter第二个参数支持传入一个Predicate接口
Predicates 是 Guava 中与 Predicate 接口配套使用的工具类,提供了一些非常有用的工具类
Collection<Person> matchingPersons = queryPersion2();
Collection<String> peopleNames =
Lists.newArrayList(
Iterables.filter(
Iterables.transform(matchingPersons, new Function<Person, String>() {
@Override
public String apply(Person from) {
return from.getName();
}
}), Predicates.notNull()
)
);
- 使用filter过滤年龄大于25岁的人
Collection<Person> persons = queryPersion();
List<Person> oldPeople = Lists.newArrayList(Iterables.filter(persons, new Predicate<Person>() {
public boolean apply(Person person) {
return person.getAge() >= 25;
}
}));
- 将list数据结构变形为map,将list中对象的某个属性提取出来,变为map中的key (开发中高频使用)
需要注意的是这种使用方式,将list中某个对象的属性变为map的key时,该属性不能重复或者为null
//name重复或者name为null时会报错
Collection<Person> yourList = queryPersion();
Map<String,Person> mappeds = Maps.uniqueIndex(yourList, new Function<Person,String>() {
@Nullable
public String apply(Person from) {
// do stuff here
return from.getName();
}});
- 将list数据结构变为ImmutableListMultimap
如果list中某个对象的属性会重复时,可以使用如下方法转换,但转换的数据结构是一个ImmutableListMultimap,这是guava中提供的一个数据结构,简单的可以理解为map中的value为一个list
Collection<Person> yourList = queryPersion();
ImmutableListMultimap<String, Person> mapping = Multimaps.index(yourList, new Function<Person,String>() {
public String apply(Person input) {
return input.getName();
}
});
- 高效的创建list
在可以预期一个list元素的个数时,可以使用如下方式创建,避免list在扩容时,造成性能衰减。注意的是这里只是传入一个预期的元素个数,实际情况中list中存放的元素个数并不需要完全等于预期值
Lists.newArrayListWithExpectedSize(size);
使用guava变形数据结构的更多相关文章
- Guava cacha 机制及源码分析
1.ehcahce 什么时候用比较好:2.问题:当有个消息的key不在guava里面的话,如果大量的消息过来,会同时请求数据库吗?还是只有一个请求数据库,其他的等待第一个把数据从DB加载到Guava中 ...
- 【数据结构】 最小生成树(四)——利用kruskal算法搞定例题×3+变形+一道大水题
在这一专辑(最小生成树)中的上一期讲到了prim算法,但是prim算法比较难懂,为了避免看不懂,就先用kruskal算法写题吧,下面将会将三道例题,加一道变形,以及一道大水题,水到不用高级数据结构,建 ...
- <数据结构系列3>队列的实现与变形(循环队列)
数据结构第三课了,今天我们再介绍一种很常见的线性表——队列 就像它的名字,队列这种数据结构就如同生活中的排队一样,队首出队,队尾进队.以下一段是百度百科中对队列的解释: 队列是一种特殊的线性表,特殊之 ...
- [ACM_数据结构] POJ2352 [树状数组稍微变形]
Description Astronomers often examine star maps where stars are represented by points on a plane and ...
- 使用 Google Guava 美化你的 Java 代码
文章转载自:http://my.oschina.net/leejun2005/blog/172328 目录:[ - ] 1-使用 GOOGLE COLLECTIONS,GUAVA,STATIC IMP ...
- 算法数据结构(一)-B树
介绍 B树的目的为了硬盘快速读取数据(降低IO操作次树)而设计的一种平衡的多路查找树.目前大多数据库及文件索引,都是使用B树或变形来存储实现. 目录 为什么B树效率高 B树存储 B树缺点 为什么B树效 ...
- Guava库介绍之集合(Collection)相关的API
作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文是我写的Google开源的Java编程库Guava系列之一,主要介 ...
- 浅谈算法和数据结构: 十 平衡查找树之B树
前面讲解了平衡查找树中的2-3树以及其实现红黑树.2-3树种,一个节点最多有2个key,而红黑树则使用染色的方式来标识这两个key. 维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种 ...
- 常用查找数据结构及算法(Python实现)
目录 一.基本概念 二.无序表查找 三.有序表查找 3.1 二分查找(Binary Search) 3.2 插值查找 3.3 斐波那契查找 四.线性索引查找 4.1 稠密索引 4.2 分块索引 4.3 ...
随机推荐
- DOCKER 开发学习记录
DOCKER常用命令及参数 DOCKER镜像管理命令: 检索:docker search image_name 下载:docker pull image_namge 查看本地镜像:docker ima ...
- Vijos P1497 立体图【模拟】
立体图 描述 小渊是个聪明的孩子,他经常会给周围的小朋友们讲些自己认为有趣的内容.最近,他准备给小朋友讲解立体图,请你帮他画出立体图. 小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子, ...
- 2017ecjtu-summer training #3 POJ3264
...
- poj_1144Network(tarjan求割点)
poj_1144Network(tarjan求割点) 标签: tarjan 割点割边模板 题目链接 Network Time Limit: 1000MS Memory Limit: 10000K To ...
- Ping pong(树状数组求序列中比某个位置上的数小的数字个数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2492 Ping pong Time Limit: 2000/1000 MS (Java/Others) ...
- Spring框架学习笔记(9)——Spring对JDBC的支持
一.使用JdbcTemplate和JdbcDaoSupport 1.配置并连接数据库 ①创建项目并添加jar包,要比之前Spring项目多添加两个jar包c3p0-0.9.1.2.jar和mysql- ...
- 通过Git Gui Here上传本地项目到GitHub上
要使用此种方法上传本地项目到GitHub上,前提得是你已安装Git for window工具. Git for window下载地址:http://www.xp510.com/xiazai/Appli ...
- tp5 $_ENV获取不到数据
$_ENV变量是取决于服务器的环境变量的,从不同的服务器上获取的$_ENV变量打印出的结果可能是不同的. php的配置文件php.ini的配置项为:variables_order = "GP ...
- dede标签:定义文件夹
相关函数: 文件\include\taglib\arclist.lib.php第7行 function lib_arclist(&$ctag,&$refObj)
- ngRx 官方示例分析 - 1. 介绍
ngRx 的官方示例演示了在具体的场景中,如何使用 ngRx 管理应用的状态. 示例介绍 示例允许用户通过查询 google 的 book API 来查询图书,并保存自己的精选书籍列表. 菜单有两 ...