当前位置: 首页 > news >正文

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的总结,希望大家能从中有所收获。

相关文章:

  • 前端实现图片懒加载(lazyload)的两种方式
  • axios封装,api接口封装统一管理
  • Bzoj1208 [HNOI2004]宠物收养所
  • 关于虚拟DOM和Diff算法的理解及应用场景
  • python selenium webdriver入门基本操作
  • 对ChemDraw Prime 16.0你了解多少
  • vue项目打包上线的流程
  • css-css权威指南学习笔记1
  • 前端常见面试题总结
  • 最近帮客户实施的基于SQL Server AlwaysOn跨机房切换项目
  • 解决“chrome提示adobe flash player 已经过期”的小问题
  • Java 通过JDBC连接Mysql数据库
  • 跟我一起写 Makefile(十三)
  • 无向图的结合点
  • CSDN上的文章好像是hBifts的嘛。怎么连作者名字都不提一下。过份!
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • create-react-app做的留言板
  • C学习-枚举(九)
  • express + mock 让前后台并行开发
  • JavaWeb(学习笔记二)
  • js对象的深浅拷贝
  • Js基础知识(四) - js运行原理与机制
  • KMP算法及优化
  • mysql常用命令汇总
  • rabbitmq延迟消息示例
  • Redis在Web项目中的应用与实践
  • Solarized Scheme
  • SpriteKit 技巧之添加背景图片
  • vue中实现单选
  • Zsh 开发指南(第十四篇 文件读写)
  • 爱情 北京女病人
  • 半理解系列--Promise的进化史
  • 分布式任务队列Celery
  • 开源SQL-on-Hadoop系统一览
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 优秀架构师必须掌握的架构思维
  • 原生js练习题---第五课
  • 终端用户监控:真实用户监控还是模拟监控?
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​渐进式Web应用PWA的未来
  • #android不同版本废弃api,新api。
  • #pragma pack(1)
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (C++)八皇后问题
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (libusb) usb口自动刷新
  • (MATLAB)第五章-矩阵运算
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (论文阅读30/100)Convolutional Pose Machines
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (七)Knockout 创建自定义绑定