版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Guava快速进阶主讲人:陈雄华第1页,共44页。目录Guava概述Strings基础类型CollectionsFunctions and PredicatesIO处理其它第2页,共44页。Guava是什么?Google开源核心类库!快乐编程,快速编程!高效稳定,充分测试!第3页,共44页。如何获取Guava? com.google.guava guava 12.0/p/guava-libraries/项目网址:Maven:第4页,共44页。目录Guava概述Strings基础类型CollectionsFunctions and PredicatesIO处理其它第5页,共44页。Joiner:
2、合并字符串 Test public void testJoiner() String str1 = Joiner.on(;).skipNulls() .join(Arrays.asList(a,b,null,c); assertEquals(str1,a;b;c); String str2 = Joiner.on(,).join(Arrays.asList(1, 5, 7); assertEquals(str2,1,5,7); 第6页,共44页。Splitter:OOP/ApacheStringUtils.Stringtokens1=StringUtils.split(one,two,thre
3、e,);/GoogleGuavasplitter.Iteratabletokens2=Splitter.on(,),split(one,two,three);很明显,google提供的方法更加的面向对象一点,因为它要先创建一个Splitter对象,然后使用它来分割字符串,而apache的方法则有点函数式编程的味道,它的方法都是静态的。和apache commons StringUtils使用方法比拼第7页,共44页。Splitter:性能 Test public void testPerformance() final String numberList = One,Two,Three,Fou
4、r,Five,Six,Seven,Eight,Nine,Ten; long start = System.currentTimeMillis(); for(int i=0; i1000000; i+) StringUtils.split(numberList, ,); System.out.println(System.currentTimeMillis() - start); start = System.currentTimeMillis(); for(int i=0; i1000000; i+) Splitter.on(,).split(numberList ); System.out.
5、println(System.currentTimeMillis() - start); start = System.currentTimeMillis(); Splitter splitter = Splitter.on(,); for(int i=0; i1000000; i+) splitter.split(numberList ); System.out.println(System.currentTimeMillis() - start); 和apache commons StringUtils性能比拼apache commons :406guava(未复用Splitter) :3
6、6guava(复用Spliter) :10第8页,共44页。Splitter:灵活 Test public void testSplitter() Iterable arrs = Splitter.on(,) .trimResults() 头尾去除 .omitEmptyStrings() 忽略空字符串 .split(,a,b,); String str2 = Joiner.on(;).join(arrs); assertEquals(str2,a;b); 第9页,共44页。CharMatcher:字符串匹配器 CharMatcher包括两个功能,其一是字符串匹配,其二是字符串处理,它使匹配和处
7、理解耦了,使字符串处理的灵活性大大增强! Test public void testCharMatcher() assertEquals( CharMatcher.DIGIT.retainFrom(some text 89983 and more),89983); assertEquals( CharMatcher.DIGIT.removeFrom(some text 89983 and more), some text and more); assertEquals( CharMatcher.anyOf(abcxy).removeFrom(abcdefgxyz),defgz); /匹配条件复
8、合运算 String str1 = CharMatcher.inRange(a, f) .and(CharMatcher.isNot(c) .and(CharMatcher.isNot(e) .or(CharMatcher.is(z) .replaceFrom(abyczef, *); assertEquals(str1,*yc*e*); 第10页,共44页。目录Guava概述Strings基础类型CollectionsFunctions and PredicatesIO处理其它第11页,共44页。来看实例 Test public void testMe() List intArr = Int
9、s.asList(1, 3, 4, 6); String intStr = Ints.join(, 1, 2, 3, 4); int concat = Ints.concat(new int1, 3, new int4, 6); int max = Ints.max(2, 3, 4, 7); boolean contains = Ints.contains(new int1, 3, 4, 5, 6); int ints = Ints.toArray(Lists.newArrayList(1, 2, 3, 5); 第12页,共44页。基础类型通用方法GuavaJDK对应GuavaJDK对应Lis
10、t asList(prim. backingArray)Arrays.asListint lastIndexOf(prim array, prim target)List.lastIndexOfprim toArray(Collection collection)Collection.toArray()prim min(prim. array)Collections.minprim concat(prim. arrays)Iterables.concatprim max(prim. array)Collections.maxboolean contains(prim array, prim t
11、arget)Collection.containsString join(String separator, prim. array)Joiner.on(separator).joinint indexOf(prim array, prim target)List.indexOfComparator lexicographicalComparator()Ordering.natural().lexicographical()第13页,共44页。对应工具类基础类型对应工具类booleanBooleansbyteBytes charCharsdoubleDoublesfloatFloatsintI
12、ntslongLongsshortShorts第14页,共44页。目录Guava概述Strings基础类型CollectionsFunctions and PredicatesIO处理其它第15页,共44页。泛型实例化:List Test public void testListGeneric() List list1 = new ArrayList(); /原始的方式 list1.add(a); list1.add(b); List list2 = Lists.newArrayList(); list2.add(a); list2.add(b); List list3 = Lists.new
13、ArrayList(a,b); List list4 = Lists.asList(a, b, new Stringc, d); 第16页,共44页。泛型实例化:Set Test public void testListGeneric() List list1 = new ArrayList(); /原始的方式 list1.add(a); list1.add(b); List list2 = Lists.newArrayList(); list2.add(a); list2.add(b); List list3 = Lists.newArrayList(a,b); List list4 = L
14、ists.asList(a, b, new Stringc, d); 第17页,共44页。一对多之Multimap之前MapString,ListmyClassListMaptest2=newHashMapString,List()voidputMyObject(Stringkey,Objectvalue)ListmyClassList=myClassListMap.get(key);if(myClassList=null)myClassList=newArrayList();myClassListMap.put(key,myClassList);myClassList.add(value);
15、 自己实现太麻烦,你需要检查key是否存在,否则创建一个,最后代码成为这个样子: 比较痛苦,如果你希望检查List中的对象是否存在,删除一个对象,或者遍历整个数据结构,那么需要更多的代码。第18页,共44页。Multimap来了MultimapmyMultimap=ArrayListMultimap.create(); Test public void testMultimap() MultimapmyMultimap=ArrayListMultimap.create(); myMultimap.put(Fruits,Bannana); myMultimap.put(Fruits,Apple)
16、; myMultimap.put(Fruits,Pear); myMultimap.put(Vegetables,Carrot); int size= myMultimap.size(); System.out.println(size);/4 Collection fruits=myMultimap.get(Fruits); System.out.println(fruits);/Bannana,Apple myMultimap.remove(Fruits,Pear); System.out.println(myMultimap.get(Fruits);/Bannana,Apple myMu
17、ltimap.removeAll(Fruits); System.out.println(myMultimap.get(Fruits);/(EmptyCollection!) 这里需要注意,所有的guava的集合都有create()方法,这个好处就是比较简单,你不用重复泛型信息了。第19页,共44页。Multimap更多 这里有一点你可能会疑惑,就是为何get方法返回的是一个collection而不是list,这是因为前者会更加有用。如果你需要基于multimap直接操作list或者set,那么可以使用在定义类型的时候使用子类名称:ListMultimap,SetMultimap和Sorted
18、SetMultimap。例如:ListMutlimap myMutlimap = ArrayListMultimap.create(); List myValues = myMutlimap.get(myKey); / Returns a List, not a Collection. 第20页,共44页。BiMaps 一个普通的map是一个key/value的集合,你可以使用key来查询,但不能用value查询key,但是BiMaps则都可以。BiMap britishToAmerican = HashBiMap.create(); /Initialise and use just like
19、 a normal map britishToAmerican.put(aubergine,egglant); britishToAmerican.put(courgette,zucchini); britishToAmerican.put(jam,jelly); System.out.println(britishToAmerican.get(aubergine); / eggplant BiMap americanToBritish =britishToAmerican.inverse(); System.out.println(americanToBritish.get(eggplant
20、); / aubergine System.out.println(americanToBritish.get(zucchini); / courgette 强制唯一性:首先,BiMap强制其value的唯一性,如果发现违规则会抛出,可用forcePut(key,value)覆盖已有的条目;inverse方法:返回BiMap的视图,如果对视图对象操作将影响原BiMap对象;第21页,共44页。MultisetMultiset是什么?顾名思义,Multiset和Set的区别就是可以保存多个相同的对象它和List有什么区别?在JDK中,List和Set有一个基本的区别,就是List可以包含多个相同
21、对象,且是有顺序的,而Set不能有重复,且不保证顺序(有些实现有顺序,例如LinkedHashSet和SortedSet等)所以Multiset占据了List和Set之间的一个灰色地带:允许重复,但是不保证顺序。注意:这种集合在apache commons collections中也被称作“Bag”.第22页,共44页。Multiset怎么使用? Test public void testMultiset() Multiset wordsMultiset = HashMultiset.create(); wordsMultiset.addAll( Lists.newArrayList(good
22、,good,study,day,day,up); assertEquals(wordsMultiset.count(good),2); wordsMultiset.remove(good,2); assertEquals(wordsMultiset.count(good),0); Multiset有一个有用的功能,就是跟踪每种对象的数量,所以你可以用来进行数字统计。第23页,共44页。更多的集合类型 Guava提供了若干个额外的集合类,它们是JDK集合类的补充,可以和JDK集合类和平共处。JDKGuavaMapCorresponding MultisetSupportsnullelements
23、HashMapHashMultisetYesTreeMapTreeMultisetYes (if the comparator does)LinkedHashMapLinkedHashMultisetYesConcurrentHashMapConcurrentHashMultisetNoImmutableMapImmutableMultisetNo第24页,共44页。目录Guava概述Strings基础类型CollectionsFunctions and PredicatesIO处理其它第25页,共44页。Function Test public void testTransform() Li
24、st lowerCase = Lists.newArrayList(tom,jhon) ; List upperCase = Lists.transform(lowerCase, new Function() public String apply(Nullable String s) return s.toUpperCase(); ); for (String s : upperCase) System.out.println(s);/print TOM,JHON 利用它们,可以为集合类的转换提供自定义的转换函数。第26页,共44页。Function:函数式编程 Test public vo
25、id testTransform() List lowerCase = Lists.newArrayList(tom,jhon) ; List upperCase = Lists.newArrayList(); for (String s : lowerCase) upperCase.add(s.toUpperCase(); 使用JDK Test public void testTransform() List lowerCase = Lists.newArrayList(tom,jhon) ; List upperCase = Lists.transform(lowerCase, new F
26、unction() public String apply(String s) return s.toUpperCase(); ); 使用Guava,闭包风格第27页,共44页。Function:集合Api支持 函数的最大用途是对集合元素进行各种转换,Guava集合工具都拥有相应的API:Iterables.transform(Iterable, Function);Iterators.transform(Iterator, Function);Collections2.transform(Collection, Function)Lists.transform(List, Function)
27、Maps.transformValues(Map, Function)Multimaps.transformValues(Multimap, Function)Multimaps.transformValues(ListMultimap, Function)Tables.transformValues(Table, Function)Maps.transformEntries(Map, EntryTransformer).第28页,共44页。Predicate:谓词(或称断言) Test public void testPredicate() Set lowerCase = Sets.newH
28、ashSet(tom, jhon); /using jdk Set notJhon = Sets.newHashSet(); for (String s : lowerCase) if(!jhon.equalsIgnoreCase(s) notJhon.add(s); /using guava notJhon = Sets.filter(lowerCase, new Predicate() public boolean apply(String s) return !jhon.equalsIgnoreCase(s); ); System.out.println(ddd); 最常的功能是,使用P
29、redicate对集合进行过滤。第29页,共44页。Predicate:集合Api支持 函数的最大用途是对集合元素进行过滤,Guava集合工具都拥有相应的API:Iterables.filter(Iterable, Predicate);Iterators.filter(Iterator, Predicate);Collections2.filter(Collection, Predicate)Sets.filter(Set, Predicate)Sets.filter(SortedSet, Predicate)Maps.filterKeys(Map, Predicate)Multimaps.
30、filterKeys(Multimap, Predicate). 注意:Lists的过滤方法被特意忽略了,因为List的get(int) 效率不高,所以请使用如下方式进行过滤:Lists.newArrayList(Collections2.filter(list, predicate) 第30页,共44页。目录Guava概述Strings基础类型CollectionsFunctions and PredicatesIO处理其它第31页,共44页。Files:操作文件方便! Test public void testFiles() throws Throwable ClassPathResour
31、ce resource = new ClassPathResource(1.txt); byte bytes = Files.toByteArray(resource.getFile();/读为二进制数组 String str = Files.toString(resource.getFile(), Charsets.UTF_8);/读文件内容 /拷贝文件 Files.copy(resource.getFile(),new File(resource.getFile().getParent()+/2.txt); List lines = Files.readLines(resource.get
32、File(), Charsets.UTF_8);/读取每行 /通过回调函数单行处理 Files.readLines(resource.getFile(), Charsets.UTF_8,new LineProcessor() private String allLines = ; public boolean processLine(String s) throws IOException allLines += s; return true; public String getResult() return allLines; ); 第32页,共44页。InputSupplier/Outpu
33、tSupplier Test public void testByteStreams() throws Throwable ClassPathResource resource = new ClassPathResource(1.txt); /使用InputStream需要外部显式close() InputStream inputStream = resource.getInputStream(); try byte bytes = ByteStreams.toByteArray(inputStream); finally inputStream.close(); /使用InputSuppli
34、er则无需close(),API内部会close之 InputSupplier inputSupplier = Files.newInputStreamSupplier(resource.getFile(); byte bytes = ByteStreams.toByteArray(inputSupplier); 使用InputStream/OutputStream时,一定要在finally中close外部资源,如果忘记了会造成资源锁定。Guava提供的InputSupplier/OutputSupplier会自动完全资源关闭,Guava的众多IO工具类API都支持这对接口,免除关闭资源的问题
35、。第33页,共44页。ByteStreams/CharStreamsstatic long copy(InputStream from, OutputStream to);/不会关闭流static long copy(InputSupplier from, OutputSupplier to) /会关闭流static void readFully(InputStream in, byte b) static bytetoByteArray(InputStream in)staticvoid write(byte from, OutputSupplier to) ByteStreams Char
36、Streams static List readLines(Readable r) static StringtoString(Readable r)第34页,共44页。目录Guava概述Strings基础类型CollectionsFunctions and PredicatesIO处理其它第35页,共44页。Objects:Object方法实现 Override public int hashCode() return Objects.hashCode(getId(), getName(); Override public String toString() return Objects.t
37、oStringHelper(this).add(id, getId().add(name, getName().toString(); Override public boolean equals(Object o) if (!(o instanceof Item) return false; Item other = (Item) o; return Objects.equal(getId(), other.getId() & Objects.equal(getName(), other.getName(); 第36页,共44页。Objects:覆盖Object通用方法hashCode pu
38、blic int hashCode() return Objects.hashCode(getId(), getName(); public int hashCode( ) return new HashCodeBuilder( 17 , 37 ) .append(firstName) .append(lastName).toHashCode( );apache commonsGuava第37页,共44页。Objects:覆盖Object通用方法toString Override public String toString() return Objects.toStringHelper(th
39、is) .add(id, getId() .add(name, getName() .toString(); public String toString() return new ToStringBuilder(this) .append(name, getName() .append(age, getAge() .toString();apache commonsGuava第38页,共44页。Objects:覆盖Object通用方法equals public boolean equals(Object obj) if (!(obj instanceof Person) return false; Person other = (Person) obj; r
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论