Google Guava14.0 瓜娃学习笔记

Guava 是java api的增强与扩展,提供复杂的java 数据结构,使你的代码更简短精炼,具有良好的可读性。看看guava给我们提供了哪些很酷的功能:

  • 集合创建:
Map<String, Map<String, String>> map = Maps.newHashMap();
List<List<Map<String, String>>> list = Lists.newArrayList();
  • 集合初始化:
Set<String> set = Sets.newHashSet("one","two","three");
List<String> list = Lists.newArrayList("one","two","three");
  • Immutable Collections: 不可变的集合,还在使用 Collections.unmodifiableXXX() ? Immutable Collections 这才是真正的不可修改的集合
 ImmutableSet<String> immutableSet = ImmutableSet.of("RED", "GREEN");

从构造的方式来说,ImmutableSet 集合还提供了 Builder 模式来构造一个集合 :

 Builder<String>  builder = ImmutableSet.builder();
 ImmutableSet<String> immutableSet = builder.add("RED").addAll(set).build();
  • MultiMap:一种key可以重复的map,子类有ListMultimap和SetMultimap,对应的通过key分别得到list和set
Multimap<String, Person> customersByType =ArrayListMultimap.create();
customersByType.put("abc", new Person(1, 1, "a", "46546", 1, 20));
customersByType.put("abc", new Person(1, 1, "a", "46546", 1, 30));
  • Multiset:把重复的元素放入集合,并且可以统计重复元素的个数

Multiset<Integer> multiSet = HashMultiset.create();
multiSet.add(10);
multiSet.add(30);
multiSet.add(30);
multiSet.add(40);

System.out.println( multiSet.count(30)); // 2
System.out.println( multiSet.size());    //4

  • Table:相当于有两个key的map。

Table<Integer,Integer,Person> personTable=HashBasedTable.create();
personTable.put(1,20,new Person(1, 1, "a", "46546", 1, 20));
personTable.put(0,30,new Person(2, 1, "ab", "46546", 0, 30));

// 得到行集合
Map<Integer,Person> rowMap= personTable.row(0);
int maxAge= Collections.max(rowMap.keySet());

  • BiMap:java.util.Map 只能保证 key 的不重复,BiMap 保证 value 也不重复,提供inverse()方法,可以通过key得到value,也可以通过value得到key
//双向map
BiMap<Integer,String> biMap=HashBiMap.create();
biMap.put(1,"hello");
biMap.put(2,"my");
int value= biMap.inverse().get("my");
  • ClassToInstanceMap:有的时候,你的map的key并不是一种类型,他们是很多类型,你想通过映射他们得到这种类型,guava提供了ClassToInstanceMap满足了这个目的,除了继承自Map接口,ClassToInstaceMap提供了方法 T getInstance(Class<T>) 和 T putInstance(Class<T>, T),消除了强制类型转换。
ClassToInstanceMap<Person> classToInstanceMap =MutableClassToInstanceMap.create();
classToInstanceMap.putInstance(Person.class, new Person(1,20,"abc","46464",1,100));
Person person = classToInstanceMap.getInstance(Person.class);
  • Predicate:谓词是一个简单的接口,只有一个方法返回布尔值,但是他是一个很令人惊讶的集合方法,当你结合collections2.filter方法使用,这个筛选方法返回原来的集合中满足这个谓词接口的元素。比如要按性别筛选:    

Collections2.filter(personList,new Predicate<Person>() {
    @Override
    public boolean apply( Person input) {
        return input.getSex()==0;
    }
})

  同时可以转换一个集合为另外一个集合:

Lists.transform(personList,new Function<Person, String>() {
    @Override
    public String apply( Person input) {
        return input.getName();
    }
})

  • MapMaker: 超级强大的 Map 构造类,是用来构造 ConcurrentMap 的工具类

ConcurrentMap<String, Object> mapAll = new MapMaker()
    .concurrencyLevel(8)
    .softKeys()
    .weakValues()
    .expireAfterWrite(30, TimeUnit.SECONDS)
    .maximumSize(100)
    .makeComputingMap(
      new Function<String, Object>() {
        public Object apply(String key) {
          return createObject(key);
     }});

  • Ordering: 非常灵活的排序类,大家知道用 Comparator 作为比较器来对集合排序,但是对于多关键字排序 Ordering class 可以简化很多的代码

Lists.newArrayList(30, 20, 60, 80, 10);
Ordering.natural().sortedCopy(numbers); //10,20,30,60,80
Ordering.natural().reverse().sortedCopy(numbers); //80,60,30,20,10
Ordering.natural().min(numbers); //10
Ordering.natural().max(numbers); //80
Lists.newArrayList(30, 20, 60, 80, null, 10);
Ordering.natural().nullsLast().sortedCopy(numbers); //10, 20,30,60,80,null
Ordering.natural().nullsFirst().sortedCopy(numbers); //null,10,20,30,60,80

List<Person> personList=Lists.newArrayList(
new Person(3, 1, "abc", "46546", 0, 25),
new Person(2, 1, "ab", "46546", 0, 30),
new Person(5, 1, "ade", "46546",0, 27)
);

Ordering<Person> byAge = new Ordering<Person>() {
    @Override
    public int compare( Person left, Person right) {
        return right.getAge()-left.getAge();
    }
};

for(Person p: byAge.immutableSortedCopy(personList))
{
    System.out.println(p);
}

// 使用ComparisonChain比较多字段

Collections.sort(list, new Comparator<Foo>(){    
    @Override
    return ComparisonChain.start()
         .compare(f1.a, f2.a, comparatorA)
         .compare(f1.b, f2.b, comparatorB)
         .compare(f1.c, f2.c, comparatorC).result();
 }});

maven坐标:

<dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>14.0-rc2</version>
</dependency>

对于开发人员来说,Guava 确实是一把利器,封装了许多实用的API,让我们编写代码更简单易读,这篇文章是我学习Guava的总结,希望大家能从中有所收获。

时间: 2024-10-14 00:55:56

Google Guava14.0 瓜娃学习笔记的相关文章

HBase-1.0.1学习笔记汇总

欢迎访问:鲁春利的工作笔记,学习是一种信仰,让时间考验坚持的力量. HBase-1.0.1学习笔记(一)集群搭建 http://luchunli.blog.51cto.com/2368057/1682049HBase-1.0.1学习笔记(二)客户端访问 http://luchunli.blog.51cto.com/2368057/1687458 HBase-1.0.1学习笔记(三)启动脚本解析 http://luchunli.blog.51cto.com/2368057/1690619 HBas

hadoop1.0.3学习笔记

回 到 目 录 最近要从网上抓取数据下来,然后hadoop来做存储和分析.每晚尽量更新 呆毛王赛高 月子酱赛高 小唯酱赛高 目录 安装hadoop1.0.3 HDFS wordcount mapreduce去重 mapreduce算平均分 mapreduce排序 安装hadoop1.0.3 1 ubuntu中安装hadoop 1.0.3 2 ------------伪分布式安装------------- 3 1.安装ssh 4 sudo apt-get install openssh-serve

Redis3.0.5学习笔记(一)基础入门

欢迎访问:鲁春利的工作笔记,学习是一种信仰,让时间考验坚持的力量. 官方网站:http://redis.io/ 下载地址:http://redis.io/download 中文帮助:http://www.redis.cn/ Redis是一种面向"键/值"对数据类型的内存数据库,可以满足我们对海量数据的读写需求. redis的键只能是字符串: redis的值支持多种数据类型: 1:字符串 string 2:哈希 hash 3:字符串列表 list 4:字符串集合 set 不重复,无序 5

Redis3.0.5学习笔记(四)Redis中键的生存时间

欢迎访问:鲁春利的工作笔记,学习是一种信仰,让时间考验坚持的力量. 本文出自 "闷葫芦的世界" 博客,请务必保留此出处http://luchunli.blog.51cto.com/2368057/1710786

Redis3.0.5学习笔记(三)JavaApi操作Redis

欢迎访问:鲁春利的工作笔记,学习是一种信仰,让时间考验坚持的力量. 本文出自 "闷葫芦的世界" 博客,请务必保留此出处http://luchunli.blog.51cto.com/2368057/1710783

vue2.0 路由学习笔记

昨天温故了一下vue2.0的路由 做个笔记简单记录一下! 1.首相和vue1.0一样 要使用vuejs的路由功能需要先引入vue-router.js 2.然后修改原有a标签处代码 这里以一个ul li a 为例 <ul> <li><a href="#"></a></li> <li><a href="#"></a></li> </ul> 使用 rou

Swift2.0 函数学习笔记

最近又有点忙,忙着找工作,忙着适应这个新环境.现在好了,上班两周周了,也适应过来了,又有时间安安静静的就行我们前面的学习了.今天这篇笔记,记录的就是函数的使用.下面这些代码基本上是理清楚了函数的额使用,但还有一块“闭包”的内容,后面我们单独写一块出来. // 形参传递的过程中,由于没有写外部形参名称,第一个形参的外部形参名字可以省略,第二的的不可以省略 let zxtest = testString(1, zc: 2) print(zxtest) // 返回值是一个元组的形式返回到,参数的传递和

xUtils3.0框架学习笔记

xUtils是开速开发安卓项目的开源框架,开源项目地址:https://github.com/wyouflf/xUtils3.使用起来非常方便.主要功能包括: xUtils 支持超大文件(超过2G)上传,更全面的http请求协议支持(11种谓词). 拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响. 图片绑定支持gif(受系统兼容性影响, 部分gif文件只能静态显示), webp; 支持圆角, 圆形, 方形等裁剪, 支持自动旋转等. 数据库api简化提高性能, 达到和greenDao一致的

zabbix 3.0.3 学习笔记

一.安装zabbix及解决图表方块字 1.安装zabbix(配置好相关yum源,解决包依赖问题,参考官方文档) yum install zabbix-agent zabbix-server-mysql zabbix-web-mysql mariadb-server -y 2.更换PHP的时区 vim /etc/php.ini data.timezone = "Asia/Shanghai" 3.配置mysql,解决编码问题 vim /etc/my.cnf character-set-se