国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Guava基礎(chǔ)知識

2019-11-08 02:12:10
字體:
供稿:網(wǎng)友

Guava簡介Optional新集合類型Function 和PRedicate字符串處理字符匹配器CharMatcherEventBus

Guava簡介

Guava是google基于java1.6非常強大的API擴展庫,提供了如:集合、緩存、原生類型支持、并發(fā)庫、通用注解、字符串處理 、I/O 等等。使用這些開源的類庫,不僅能夠節(jié)約你的寶貴時間,減少出錯可能,還可以讓coder將時間都集中在處理自己獨特的業(yè)務(wù)邏輯上。同時多看看這些優(yōu)秀的開源庫代碼,向大牛學(xué)習(xí)編碼的原則和規(guī)范,提升自己設(shè)計API的能力,讓代碼更易讀,更整潔,更簡單,因為這些API自身就是很好的例子。

源碼包:  com.google.common.annotations:普通注解類型。  com.google.common.base:基本工具類庫和接口。  com.google.common.cache:緩存工具包,支持多種緩存過期策略。  com.google.common.collect:帶泛型的集合接口擴展和實現(xiàn),以及工具類,開源框架下隨處可見。  com.google.common.escape:   com.google.common.eventbus:發(fā)布訂閱風(fēng)格的事件總線。  com.google.common.hash: 哈希工具包,更復(fù)雜的散列實現(xiàn),并提供布魯姆過濾器的實現(xiàn)。  com.google.common.html: HTML工具包。  com.google.common.io:I/O工具包。  com.google.common.math:原始算術(shù)類型和超大數(shù)的運算工具包。  com.google.common.net:網(wǎng)絡(luò)工具包。  com.google.common.primitives:八種原始類型和無符號類型的靜態(tài)工具包。  com.google.common.reflect:反射工具包。  com.google.common.util.concurrent:多線程工具包。  com.google.common.util.xml:xml工具包。

本篇介紹一些編碼中經(jīng)常使用的集合類:

Optional

開發(fā)人員使用null表明的是某種缺失情形:可能是已經(jīng)有一個默認值,或沒有值,或找不到值。例如,Map.get返回null就表示找不到給定鍵對應(yīng)的值。

Guava用Optional表示可能為null的T類型引用。一個Optional實例可能包含非null的引用(我們稱之為引用存在),也可能什么也不包括(稱之為引用缺失)。它從不說包含的是null值,而是用存在或缺失來表示。但Optional從不會包含null值引用。

使用Optional除了賦予null語義,增加了可讀性,最大的優(yōu)點在于它是一種傻瓜式的防護。Optional迫使你積極思考引用缺失的情況,因為你必須顯式地從Optional獲取引用。

創(chuàng)建Optional實例(以下都是靜態(tài)方法): Optional.of(T) 創(chuàng)建指定引用的Optional實例,若引用為null則快速失敗 Optional.absent() 創(chuàng)建引用缺失的Optional實例 Optional.fromNullable(T) 創(chuàng)建指定引用的Optional實例,若引用為null則表示缺失

用Optional實例查詢引用(以下都是非靜態(tài)方法): boolean isPresent()如果Optional包含非null的引用(引用存在),返回true T get() 返回Optional所包含的引用,若引用缺失,則拋出java.lang.IllegalStateException T or(T) 返回Optional所包含的引用,若引用缺失,返回指定的值 T orNull() 返回Optional所包含的引用,若引用缺失,返回null

不可變集合Immutable 當(dāng)對象被不可信的庫調(diào)用時,不可變形式是安全的; 不可變對象被多個線程調(diào)用時,不存在競態(tài)條件問題 不可變集合不需要考慮變化,因此可以節(jié)省時間和空間。所有不可變的集合都比它們的- 可變形式有更好的內(nèi)存利用率(分析和測試細節(jié)); 不可變對象因為有固定不變,可以作為常量來安全使用。 創(chuàng)建不可變集合: copyOf方法,如ImmutableSet.copyOf(set); of方法,如ImmutableSet.of(“a”, “b”, “c”)ImmutableMap.of(“a”, 1, “b”, 2); Builder工具

新集合類型

Guava引入了很多JDK沒有的、但我們發(fā)現(xiàn)明顯有用的新集合類型。這些新類型是為了和JDK集合框架共存。

Multiset 統(tǒng)計單詞出現(xiàn)的次數(shù)

String sentences = "this is a story, there is a good girl in the story."; Map<String, Integer> counts = new HashMap<String, Integer>(); for (String Word : words) { } else { counts.put(word, count + 1); }} Multiset multiset = HashMultiset.create(); for (String word : words) { multiset.add(word); } for (Object element : multiset.elementSet()) { System.out.println((String) element + ":" + multiset.count(element)); }

Multimap Guava的 Multimap可以很容易地把一個鍵映射到多個值。換句話說,Multimap是把鍵映射到任意多個值的一般方式。

BiMap BiMap是一個有用的集合類型,很簡單,它就是一個雙向的映射。

Function 和Predicate

Function<String, Integer> lengthFunction = new Function<String, Integer>() { public Integer apply(String string) { return string.length(); }};Predicate<String> allCaps = new Predicate<String>() { public boolean apply(String string) { return CharMatcher.JAVA_UPPER_CASE.matchesAllOf(string); }};Multiset<Integer> lengths = HashMultiset.create( Iterables.transform(Iterables.filter(strings, allCaps), lengthFunction));

Functions提供簡便的Function構(gòu)造和操作方法

toStringFunction()compose(Function, Function) …

Predicates提供了處理Predicate的方法

compose(Predicate, Function)and(Predicate…)or(Predicate…)not(Predicate) …

ListenableFuture 傳統(tǒng)JDK中的Future通過異步的方式計算返回結(jié)果:在多線程運算中可能或者可能在沒有結(jié)束返回結(jié)果,F(xiàn)uture是運行中的多線程的一個引用句柄,確保在服務(wù)執(zhí)行返回一個Result。

ListenableFuture可以允許你注冊回調(diào)方法(callbacks),在運算(多線程執(zhí)行)完成的時候進行調(diào)用, 或者在運算(多線程執(zhí)行)完成后立即執(zhí)行。這樣簡單的改進,使得可以明顯的支持更多的操作,這樣的功能在JDK concurrent中的Future是不支持的。

private ListeningExecutorService singleExecutorService = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));void sendEmail(final Map<String, String> params, final int typeCode, final String recipients, final String reMail, int OperatorId) { ListenableFuture<Boolean> listenableFuture = singleExecutorService.submit(new Callable<Boolean>() { @Override public Boolean call() throws Exception { return mailService.send(typeCode, recipients, params, reMail); } }); Futures.addCallback(listenableFuture, new FutureCallback<Boolean>() { @Override public void onSuccess(Boolean result) { if (result) { LOGGER.info("sendEmail success ,to:" + recipients + " params: " + params.toString()); } else { LOGGER.warn("sendEmail failure ,to:" + recipients + " ,params: " + params.toString()); } } @Override public void onFailure(Throwable t) { LOGGER.error("sendEmail throw error, to:" + recipients + " ,params: " + params.toString() + " ,throw Exception:" + t.getMessage(), t); } });}

字符串處理

連接器[Joiner] 用分隔符把字符串序列連接起來也可能會遇上不必要的麻煩。如果字符串序列中含有null,那連接操作會更難。Fluent風(fēng)格的Joiner讓連接字符串更簡單。 Joiner.on(",").join(Arrays.asList(1, 5, 7)); // returns "1,5,7" 拆分器[Splitter] splitter可以被設(shè)置為按照任何模式、字符、字符串或字符匹配器拆分。 String s = ",a,,b,"; System.out.println(Lists.newArrayList(s.split(","))); System.out.println(Splitter.on(',') .trimResults() .omitEmptyStrings() .split(s));

字符匹配器[CharMatcher]

使用CharMatcher的好處更在于它提供了一系列方法,讓你對字符作特定類型的操作:修剪[trim]、折疊[collapse]、移除[remove]、保留[retain]等等 String string = "12323 eiurwer HGWIehi"; String theDigits = CharMatcher.DIGIT.retainFrom(string); //只保留數(shù)字字符 String spaced = CharMatcher.WHITESPACE.trimAndCollapseFrom(string, ' '); String noDigits = CharMatcher.JAVA_DIGIT.replaceFrom(string, "*"); //用*號替換所有數(shù)字 String lowerAndDigit = CharMatcher.JAVA_DIGIT.or(CharMatcher.JAVA_LOWER_CASE).retainFrom(string);大小寫格式[CaseFormat] CaseFormat被用來方便地在各種ASCII大小寫規(guī)范間轉(zhuǎn)換字符串格式 LOWER_CAMEL lowerCamel LOWER_HYPHEN lower-hyphen LOWER_UNDERSCORE lower_underscore UPPER_CAMEL UpperCamel UPPER_UNDERSCORE UPPER_UNDERSCORE范例 CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "CONSTANT_NAME")

EventBus

EventBus,事件總線,guava基于觀察者模式的優(yōu)雅實現(xiàn)。對于事件監(jiān)聽和發(fā)布訂閱模式,使用guava eventbus可以省去開發(fā)人員很多事情,不用在去定義那些復(fù)雜的類或接口來實現(xiàn)事件發(fā)布與訂閱。在guava eventbus中,開發(fā)人員只需要在訂閱方法上添加上@Subscribe注解就可以了,這樣一來就省去了大量共用的編碼工作。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 大英县| 巴青县| 海门市| 元朗区| 荃湾区| 紫金县| 泾阳县| 陆良县| 长寿区| 北流市| 牡丹江市| 修文县| 达孜县| 麟游县| 嘉义县| 金塔县| 西昌市| 潍坊市| 枞阳县| 丹寨县| 沙坪坝区| 若尔盖县| 黑河市| 奉节县| 麻江县| 斗六市| 乌兰浩特市| 奎屯市| 利辛县| 南城县| 遂川县| 集安市| 涿鹿县| 岢岚县| 荥阳市| 葵青区| 垦利县| 莲花县| 资阳市| 白玉县| 兴安县|