使用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 ...
随机推荐
- 2017 Multi-University Training Contest - Team 9 1005&&HDU 6165 FFF at Valentine【强联通缩点+拓扑排序】
FFF at Valentine Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 51nod 1575 Gcd and Lcm
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1575 万年巨坑终于填掉了…… 首先是煞笔西瓜的做题历程O_O. ...
- [51nod1440]迈克打电话
有n只熊,从1到n进行编号. 第i只熊的电话号码是si.每只熊会给那些电话号码是他的子串的熊打电话(可能会给自己打). call(i, j) 表示第i只熊给第j只熊打电话的次数,也就是第j个串在第i个 ...
- 【JAVA】SWING_ 界面风格
在java中,界面外观的管理是由UIManager类来管理的.不同的系统上安装的外观不一样 ,默认的是java的跨平台外观. 1.获取系统所有外观 import javax.swing.*; impo ...
- FTP下载导致Zip解压失败的原因
情形:网关通过FTP下载快钱对账文件时通过Apache下commons-net的commons-net-3.5.jar进行封装,对账文件中有中文和英文的文字,大部分情况下能够下载成功,而且也能解压成功 ...
- [数据预处理]-中心化 缩放 KNN(一)
据预处理是总称,涵盖了数据分析师使用它将数据转处理成想要的数据的一系列操作.例如,对某个网站进行分析的时候,可能会去掉 html 标签,空格,缩进以及提取相关关键字.分析空间数据的时候,一般会把带单位 ...
- 将本地的项目导入到github仓库总结lxw
关键步骤: 第一:git clone https://github.com/lxw18231857001/demo-.git #把github上面的仓库克隆到本地 本地项目文件夹下 ...
- ThinkPhp_5框架开发【指导】
================================================== ThinkPhp_5环境安装指导 -------------------------------- ...
- echarts使用总结
项目中需要实现数据可视化,在前辈的推荐之下,最终选取了echarts来实现,在此关于echarts的使用进行总结,最终代码分享至我的github. 关于echarts echarts是百度推出的,使用 ...
- -------- ROOTKIT 核心技术——系统服务调度表挂钩调试(PART III) --------
---------------------------------------------------------------------------------------- 本篇开始进行真枪实弹的 ...