- 浏览: 36387 次
- 性别:
- 来自: 西安
文章分类
- 全部博客 (45)
- JMS应用 (0)
- 思路历程 (2)
- java核心技术学习第一卷笔记 (2)
- 问题汇总 (2)
- mysql (3)
- Spring3 (2)
- hibernate4+spring3整合 (0)
- Web前端 (2)
- Clojure (2)
- DB2 (2)
- 构建集成相关 (1)
- Javascript (1)
- 单点登录 (4)
- Java (3)
- s (0)
- Cas (1)
- css html (1)
- struts1.x (1)
- Web安全相关 (2)
- SQL注入 (1)
- Java-Servlet (1)
- struts2 (1)
- ajax (1)
- 日志框架 (1)
- 正则表达式 (1)
- lucene (1)
- 机器学习 (2)
- hessian (1)
- dubbo (1)
- maven (2)
- jquery (1)
- reids (0)
- redis (1)
- websocket (1)
最新评论
guava概述
1,大纲
让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分:
2,为神马选择瓜娃?
瓜娃是java API蛋糕上的冰激凌(精华)
高效设计良好的API.
被google的开发者设计,实现和使用。
遵循高效的java这本书的好的语法实践。
使代码更刻度,简洁,简单。
使用java 1.5的特性,
流行的API,动态的开发
它提供了大量相关的应用类,集合,多线程,比较,字符串,输入输出,缓存,网络,原生类型,数学,反射等等
百分百的单元测试,被很多的项目使用,帮助开发者专注业务逻辑而不是写java应用类
节省时间,资源,提高生产力
我的目的是为基本的java特征提供开源代码的支持,而不是自己再写一个
Apache Common库-Apache是一个很好的成熟的库,但是不支持泛型,Apache对早起的java版本很有用,(1.5之前的)
java7,java8 最新的java支持一些guava的API
guava最新的正式版本是14.0-rc2,这个版本需要java1.6支持.
最新的maven坐标是:
3,集合API的使用
3.1简化工作
可以简化集合的创建和初始化;
3.2 不变性
很大一部分是google集合提供了不变性,不变对比可变:
数据不可改变
线程安全
不需要同步逻辑
可以被自由的共享
容易设计和实现
内存和时间高效
不变对比不可修改
google的不变被确保真正不可改变,而不可修改实际上还是可以修改数据;如下所示:
3.3 新的集合类型
The Guava API provides very useful new collection types that work very nicely with existing java collections.
3.4 谓词和筛选
谓词(Predicate)是用来筛选集合的;
谓词是一个简单的接口,只有一个方法返回布尔值,但是他是一个很令人惊讶的集合方法,当你结合collections2.filter方法使用,这个筛选方法返回原来的集合中满足这个谓词接口的元素;
举个例子来说:筛选出集合中的女人
Predicates含有一些内置的筛选方法,比如说 in ,and ,not等,根据实际情况选择使用。
3.5 功能和转换
转换一个集合为另外一个集合;
实例如下:
3.6 排序
是guava一份非常灵活的比较类,可以被用来操作,扩展,当作比较器,排序提供了集合排序的很多控制;
实例如下:
guava在结合部分的API使用记录完毕,希望对广大屌丝有所帮助。
让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分:
- Introduction
- Guava Collection API
- Guava Basic Utilities
- IO API
- Cache API
2,为神马选择瓜娃?
瓜娃是java API蛋糕上的冰激凌(精华)
高效设计良好的API.
被google的开发者设计,实现和使用。
遵循高效的java这本书的好的语法实践。
使代码更刻度,简洁,简单。
使用java 1.5的特性,
流行的API,动态的开发
它提供了大量相关的应用类,集合,多线程,比较,字符串,输入输出,缓存,网络,原生类型,数学,反射等等
百分百的单元测试,被很多的项目使用,帮助开发者专注业务逻辑而不是写java应用类
节省时间,资源,提高生产力
我的目的是为基本的java特征提供开源代码的支持,而不是自己再写一个
Apache Common库-Apache是一个很好的成熟的库,但是不支持泛型,Apache对早起的java版本很有用,(1.5之前的)
java7,java8 最新的java支持一些guava的API
guava最新的正式版本是14.0-rc2,这个版本需要java1.6支持.
最新的maven坐标是:
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>14.0-rc2</version> </dependency>
3,集合API的使用
3.1简化工作
可以简化集合的创建和初始化;
类别 原来的写法 guava的写法 集合创建 Map<String, Map<String, String>> map = new HashMap<String, Map<String,String>>(); List<List<Map<String, String>>> list = new ArrayList<List<Map<String,String>>>(); Map<String, Map<String, String>> map = Maps.newHashMap(); List<List<Map<String, String>>> list = Lists.newArrayList(); //1,简化集合的创建 List<Person> personList= Lists.newLinkedList(); Set<Person> personSet= Sets.newHashSet(); Map<String,Person> personMap= Maps.newHashMap(); Integer[] intArrays= ObjectArrays.newArray(Integer.class,10); 集合初始化 Set<String> set = new HashSet<String>(); set.add("one"); set.add("two"); set.add("three"); Set<String> set = Sets.newHashSet("one","two","three"); List<String> list = Lists.newArrayList("one","two","three"); Map<String, String> map = ImmutableMap.of("ON","TRUE","OFF","FALSE"); //2,简化集合的初始化 List<Person> personList2= Lists.newArrayList(new Person(1, 1, "a", "46546", 1, 20), new Person(2, 1, "a", "46546", 1, 20)); Set<Person> personSet2= Sets.newHashSet(new Person(1,1,"a","46546",1,20), new Person(2,1,"a","46546",1,20)); Map<String,Person> personMap2= ImmutableMap.of("hello",new Person(1,1,"a","46546",1,20),"fuck",new Person(2,1,"a","46546",1,20));
3.2 不变性
很大一部分是google集合提供了不变性,不变对比可变:
数据不可改变
线程安全
不需要同步逻辑
可以被自由的共享
容易设计和实现
内存和时间高效
不变对比不可修改
google的不变被确保真正不可改变,而不可修改实际上还是可以修改数据;如下所示:
Set<Integer> data = new HashSet<Integer>(); data.addAll(Arrays.asList(10, 20, 30, 40, 50, 60, 70, 80)); Set<Integer> fixedData = Collections.unmodifiableSet(data); // fixedData - [50, 70, 80, 20, 40, 10, 60, 30] data.add(90); // fixedData - [50, 70, 80, 20, 40, 10, 90, 60, 30] 如何创建不可变的集合: ImmutableSet<Integer> numbers = ImmutableSet.of(10, 20, 30, 40, 50); 使用copyOf方法 ImmutableSet<Integer> another = mmutableSet.copyOf(numbers); 使用Builder方法 ImmutableSet<Integer> numbers2 = ImmutableSet.<Integer>builder().addAll(numbers) .add(60) .add(70).add(80).build(); //3,创建不可变的集合 ImmutableList<Person> personImmutableList= ImmutableList.of(new Person(1, 1, "a", "46546", 1, 20), new Person(2, 1, "a", "46546", 1, 20)); ImmutableSet<Person> personImmutableSet=ImmutableSet.copyOf(personSet2); ImmutableMap<String,Person> personImmutableMap=ImmutableMap.<String,Person>builder() .put("hell",new Person(1,1,"a","46546",1,20)).putAll(personMap2) .build();
3.3 新的集合类型
The Guava API provides very useful new collection types that work very nicely with existing java collections.
guava API 提供了有用的新的集合类型,协同已经存在的java集合工作的很好。 分别是 MultiMap, MultiSet, Table, BiMap, ClassToInstanceMap 种类 写的例子 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)); customersByType.put("abc", new Person(1, 1, "a", "46546", 1, 40)); customersByType.put("abc", new Person(1, 1, "a", "46546", 1, 50)); customersByType.put("abcd", new Person(1, 1, "a", "46546", 1, 50)); customersByType.put("abcde", new Person(1, 1, "a", "46546", 1, 50)); for(Person person:customersByType.get("abc")) { System.out.println(person.getAge()); } MultiSet 不是集合,可以增加重复的元素,并且可以统计出重复元素的个数,例子如下: private static void testMulitiSet() { 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,不多解释 private static void testTable() { 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)); personTable.put(0,25,new Person(3, 1, "abc", "46546", 0, 25)); personTable.put(1,50,new Person(4, 1, "aef", "46546", 1, 50)); personTable.put(0,27,new Person(5, 1, "ade", "46546",0, 27)); personTable.put(1,29,new Person(6, 1, "acc", "46546", 1, 29)); personTable.put(0,33,new Person(7, 1, "add", "46546",0, 33)); personTable.put(1,66,new Person(8, 1, "afadsf", "46546", 1, 66)); //1,得到行集合 Map<Integer,Person> rowMap= personTable.row(0); int maxAge= Collections.max(rowMap.keySet()); } BiMap 是一个一一映射,可以通过key得到value,也可以通过value得到key; private static void testBitMap() { //双向map BiMap<Integer,String> biMap=HashBiMap.create(); biMap.put(1,"hello"); biMap.put(2,"helloa"); biMap.put(3,"world"); biMap.put(4,"worldb"); biMap.put(5,"my"); biMap.put(6,"myc"); int value= biMap.inverse().get("my"); System.out.println("my --"+value); } ClassToInstanceMap 有的时候,你的map的key并不是一种类型,他们是很多类型,你想通过映射他们得到这种类型,guava提供了ClassToInstanceMap满足了这个目的。 除了继承自Map接口,ClassToInstaceMap提供了方法 T getInstance(Class<T>) 和 T putInstance(Class<T>, T),消除了强制类型转换。 该类有一个简单类型的参数,通常称为B,代表了map控制的上层绑定,例如: ClassToInstanceMap<Number> numberDefaults = MutableClassToInstanceMap.create(); numberDefaults.putInstance(Integer.class, Integer.valueOf(0)); 从技术上来说,ClassToInstanceMap<B> 实现了Map<Class<? extends B>, B>,或者说,这是一个从B的子类到B对象的映射,这可能使得ClassToInstanceMap的泛型轻度混乱,但是只要记住B总是Map的上层绑定类型,通常来说B只是一个对象。 guava提供了有用的实现, MutableClassToInstanceMap 和 ImmutableClassToInstanceMap. 重点:像其他的Map<Class,Object>,ClassToInstanceMap 含有的原生类型的项目,一个原生类型和他的相应的包装类可以映射到不同的值; private static void testClass() { ClassToInstanceMap<Person> classToInstanceMap =MutableClassToInstanceMap.create(); Person person= new Person(1,20,"abc","46464",1,100); classToInstanceMap.putInstance(Person.class,person); // System.out.println("string:"+classToInstanceMap.getInstance(String.class)); // System.out.println("integer:" + classToInstanceMap.getInstance(Integer.class)); Person person1=classToInstanceMap.getInstance(Person.class); }
3.4 谓词和筛选
谓词(Predicate)是用来筛选集合的;
谓词是一个简单的接口,只有一个方法返回布尔值,但是他是一个很令人惊讶的集合方法,当你结合collections2.filter方法使用,这个筛选方法返回原来的集合中满足这个谓词接口的元素;
举个例子来说:筛选出集合中的女人
public static void main(String[] args) { Optional<ImmutableMultiset<Person>> optional=Optional.fromNullable(testPredict()); if(optional.isPresent()) { for(Person p:optional.get()) { System.out.println("女人:"+p); } } System.out.println(optional.isPresent()); } public static ImmutableMultiset<Person> testPredict() { List<Person> personList=Lists.newArrayList(new Person(1, 1, "a", "46546", 1, 20), new Person(2, 1, "ab", "46546", 0, 30), new Person(3, 1, "abc", "46546", 0, 25), new Person(4, 1, "aef", "46546", 1, 50), new Person(5, 1, "ade", "46546",0, 27), new Person(6, 1, "acc", "46546", 1, 29), new Person(7, 1, "add", "46546",0, 33)); return ImmutableMultiset.copyOf(Collections2.filter(personList,new Predicate<Person>() { @Override public boolean apply( Person input) { return input.getSex()==0; } })); }
Predicates含有一些内置的筛选方法,比如说 in ,and ,not等,根据实际情况选择使用。
3.5 功能和转换
转换一个集合为另外一个集合;
实例如下:
public static void main(String[] args) { Optional<ImmutableMultiset<String>> optional=Optional.fromNullable(testTransform()); if(optional.isPresent()) { for(String p:optional.get()) { System.out.println("名字:"+p); } } System.out.println(optional.isPresent()); } public static ImmutableMultiset<String> testTransform() { List<Person> personList=Lists.newArrayList(new Person(1, 1, "a", "46546", 1, 20), new Person(2, 1, "ab", "46546", 0, 30), new Person(3, 1, "abc", "46546", 0, 25), new Person(4, 1, "aef", "46546", 1, 50), new Person(5, 1, "ade", "46546",0, 27), new Person(6, 1, "acc", "46546", 1, 29), new Person(7, 1, "add", "46546",0, 33)); return ImmutableMultiset.copyOf(Lists.transform(personList,new Function<Person, String>() { @Override public String apply( Person input) { return input.getName(); } })); }
3.6 排序
是guava一份非常灵活的比较类,可以被用来操作,扩展,当作比较器,排序提供了集合排序的很多控制;
实例如下:
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 public static void testOrdering() { 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), new Person(1, 1, "a", "46546", 1, 20), new Person(6, 1, "acc", "46546", 1, 29), new Person(4, 1, "aef", "46546", 1, 50), new Person(7, 1, "add", "46546",0, 33) ); 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); } }
guava在结合部分的API使用记录完毕,希望对广大屌丝有所帮助。
相关推荐
#### 一、Guava概述 Guava是Google推出的一款开源核心类库,它为Java开发者提供了丰富的工具类和实用工具集合。Guava旨在提高编程效率的同时确保代码的高质量和稳定性。它包含了大量针对日常开发过程中常见问题的...
### Guava概述 Guava是Google推出的一款Java核心类库,旨在通过添加一系列经过充分测试且高度实用的工具集来优化Java开发体验。该库包含了集合、缓存、原生类型支持、并发库、常见注解、字符串处理、I/O等多方面的...
**Google Guava官方教程概述** Google Guava 是一个开源库,为Java开发人员提供了一组核心库,包括集合、缓存、并发工具、I/O工具、字符串处理、实用方法等。这个官方教程主要针对Guava库的使用进行详细介绍,帮助...
#### 一、概述 Google Guava Collections 是 Java Collections Framework 的一个强大且实用的非官方扩展 API。它由 Google 工程师 Kevin Bourrillion 和 Jared Levy 在著名的“20%”时间开发而成,并得到了 Java ...
1. "AnOverviewofGuavaSVJUGSept2012.pdf" 可能是2012年9月在Silicon Valley Java User Group(SVJUG)会议上关于Guava的概述,可能会涵盖Guava的基本特性和用法。 2. "AnOverviewofGuavaDevoxxFRApril2012.pdf" ...
- **概述**:`base`模块是Guava库中最基础的部分,它包含了一些非常核心且常用的工具类和方法,为其他模块提供了坚实的基础。 - **示例**:如`Charsets`类用于处理字符集转换问题,简化了编码操作,避免了常见的异常...
一、Guava集合框架概述 Guava的集合框架是对Java标准库集合API的扩展与增强,其核心组件包括Immutable集合、Multiset、Multimap、Table、BiMap以及各种List、Set和Map的实现。这些组件在功能、性能和设计上都有...
提供了通用的缓存抽象,可以与各种缓存解决方案(如 EhCache、Guava Cache、Hazelcast 等)无缝集成。 12. **多线程和并发**: 引入了`TaskExecutor`和`TaskScheduler`,使得异步任务和定时任务的处理更加方便。 ...
标题中的“业余框架整合-SSHD-(1)-整体概述”指的是一个关于集成SSH(Spring、Struts、Hibernate)与SSHD(Secure Shell Daemon)框架的教程。SSH是Java Web开发中常用的三大框架,用于构建MVC模式的应用程序,而...
**缓存概述** 缓存的基本思想是将经常访问的数据暂存到高速、易访问的地方,以便下次请求时能快速获取。根据其部署位置和工作方式,缓存主要分为四类:CDN缓存、反向代理缓存、本地应用缓存和分布式缓存。 **CDN...
概述:本文将讨论如何使用 Java 高效地读取大文件,解决读取大文件时可能遇到的 OutOfMemoryError 异常问题。同时,文章还将介绍使用 Guava 和 Apache Commons IO 库来读取大文件的不同方法,并对比它们的内存占用...
概述 Elastic-Job是一个分布式计划作业解决方案。 Elastic-Job由2个独立的子项目组成:Elastic-Job-Lite和Elastic-Job-Cloud。 Elastic-Job-Lite是一种无中心的解决方案,使用轻量级的jar来协调分布式作业。 ...
Java企业在线项目Java企业最需要的... Apache Commons标准库,Guava 应用层。 为您的应用程序创建线框Spring框架概述。 Spring语境HW2的说明。 自动连线处理作业(HW2 +可选) 18.02:第三堂课作业分析HW2 +可选Spri
概述:本文介绍了使用 Spring Boot 实现缓存实战的示例,使用 Caffeine 作为缓存框架。Caffeine 是一个使用 Java 8 重写的 Guava 缓存版本,在 Spring Boot 2.0 中将取代 Guava。 一、Caffeine 简介 Caffeine 是一...
【JavaDemo:一天一天】项目概述 JavaDemo项目是一个典型的Java学习示例,它涵盖了多个核心领域,包括Disruptor库、Guava工具集、并发处理以及数据结构和算法的应用。这个项目旨在帮助开发者深入理解Java语言的强大...
标记格式的概述。 标记下来的摘要部分必须描述函数应如何在 javax.io 上显示。 使用 javax-meta 代码块,类似于 { "title":"Hello Function", "description":"", "input": "" } 编码主题 基本的java语言 开源课程...
3. Guava Cache:Google 的 Guava 库提供了简单的本地内存缓存,适用于简单的单机部署。 五、实际案例 在 `springboot-shiro-master` 项目中,可能包含以下关键文件: 1. `pom.xml`:项目依赖配置,包含了 Spring ...
1、概述 本教程将演示如何用Java高效地读取大文件。这篇文章是Baeldung (http://www.baeldung.com/) 上“Java——回归基础”系列教程的一部分。 2、在内存中读取 读取文件行的标准方式是在内存中读取,...
1.概述 * 限流目前一般都俩种`单机限流`和`分布式限流` * 单机限流不损耗性能,一般用Guava类库的RateLimiter即可,但是单机限流每次扩容,缩容线上机器都需要重新计算阈值,还会受负载策略的影响。 * 分布式限流会...