在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变形数据结构的更多相关文章

  1. Guava cacha 机制及源码分析

    1.ehcahce 什么时候用比较好:2.问题:当有个消息的key不在guava里面的话,如果大量的消息过来,会同时请求数据库吗?还是只有一个请求数据库,其他的等待第一个把数据从DB加载到Guava中 ...

  2. 【数据结构】 最小生成树(四)——利用kruskal算法搞定例题×3+变形+一道大水题

    在这一专辑(最小生成树)中的上一期讲到了prim算法,但是prim算法比较难懂,为了避免看不懂,就先用kruskal算法写题吧,下面将会将三道例题,加一道变形,以及一道大水题,水到不用高级数据结构,建 ...

  3. <数据结构系列3>队列的实现与变形(循环队列)

    数据结构第三课了,今天我们再介绍一种很常见的线性表——队列 就像它的名字,队列这种数据结构就如同生活中的排队一样,队首出队,队尾进队.以下一段是百度百科中对队列的解释: 队列是一种特殊的线性表,特殊之 ...

  4. [ACM_数据结构] POJ2352 [树状数组稍微变形]

    Description Astronomers often examine star maps where stars are represented by points on a plane and ...

  5. 使用 Google Guava 美化你的 Java 代码

    文章转载自:http://my.oschina.net/leejun2005/blog/172328 目录:[ - ] 1-使用 GOOGLE COLLECTIONS,GUAVA,STATIC IMP ...

  6. 算法数据结构(一)-B树

    介绍 B树的目的为了硬盘快速读取数据(降低IO操作次树)而设计的一种平衡的多路查找树.目前大多数据库及文件索引,都是使用B树或变形来存储实现. 目录 为什么B树效率高 B树存储 B树缺点 为什么B树效 ...

  7. Guava库介绍之集合(Collection)相关的API

    作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文是我写的Google开源的Java编程库Guava系列之一,主要介 ...

  8. 浅谈算法和数据结构: 十 平衡查找树之B树

    前面讲解了平衡查找树中的2-3树以及其实现红黑树.2-3树种,一个节点最多有2个key,而红黑树则使用染色的方式来标识这两个key. 维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种 ...

  9. 常用查找数据结构及算法(Python实现)

    目录 一.基本概念 二.无序表查找 三.有序表查找 3.1 二分查找(Binary Search) 3.2 插值查找 3.3 斐波那契查找 四.线性索引查找 4.1 稠密索引 4.2 分块索引 4.3 ...

随机推荐

  1. 基于Windows环境下MyEclipse10快捷键总结

    ---------------------------------------------MyEclipse 快捷键1(CTRL)----------------------------------- ...

  2. BZOJ 1029: [JSOI2007]建筑抢修【优先队列+贪心策略】

    1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec  Memory Limit: 162 MBSubmit: 4810  Solved: 2160[Submit][Statu ...

  3. HDU1754-I Hate It-线段树

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  4. BZOJ1758: [Wc2010]重建计划(01分数规划+点分治+单调队列)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1758 01分数规划,所以我们对每个重心进行二分.于是问题转化为Σw[e]-mid>=0, ...

  5. 刨根问底:什么是yum源,yum的工作原理又是什么

    1.刨根问底---什么是yum源?yum的工作原理? 说到yum源就必须说到linux系统中特有的依赖关系问题,yum就是为了解决依赖关系而存在的.yum源就相当是一个目录项,当我们使用yum机制安装 ...

  6. c++(堆排序)

    堆排序是另外一种常用的递归排序.因为堆排序有着优秀的排序性能,所以在软件设计中也经常使用.堆排序有着属于自己的特殊性质,和二叉平衡树基本是一致的.打一个比方说,处于大堆中的每一个数据都必须满足这样一个 ...

  7. cookie 和 session的区别

    一.总结: 1.cookie数据存放在客户的浏览器上,session数据放在服务器上. 2.cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗 考虑到安全应当使用ses ...

  8. [国嵌攻略][161][USB总线介绍]

    USB发展史 USB(universal serial bus),通用串行总线,是一种外部总线标准.用于规范电脑与外部设备的连接和通讯.USB是在1994年底由英特尔.康柏.IBM.Microsoft ...

  9. geotools实现多边形的合并&缓冲区

    这算是第一次接触开源工具包,说实话刚开始有点不知所措,中途遇到很多问题的时候也感觉头皮发麻,不过很高兴自己还是坚持下来了. geotools就不做过多的介绍了,想总结一下如何根据开源内容做自己的项目. ...

  10. [知了堂学习笔记]_牵线Eclipse和Tomcat第二篇 —— 安装Tomcat&&添加Tomcat到Eclipse

    来了来了~~~~~我们的"织女"--Tomcat来了,牛郎们等急了吧!哈哈! 一.安装Tomcat 下载地址:http://tomcat.apache.org/download-7 ...