標簽 ‘ Guava

Guava 源碼分析(Cache 原理【二階段】)

前言

在上文「Guava 源碼分析(Cache 原理)」中分析了?Guava Cache?的相關原理。

文末提到了回收機制、移除時間通知等內容,許多朋友也挺感興趣,這次就這兩個內容再來分析分析。

在開始之前先補習下 Java 自帶的兩個特性,Guava 中都有具體的應用。

閱讀全文

我的阿里面試之路

前言

最近有些朋友在面試阿里,加上?Java-Interview?項目的原因也有小伙伴和我討論,近期也在負責部門的招牌,這讓我想起年初那段長達三個月的奇葩面試經歷?。

本來沒想拿出來說的,畢竟最后也沒成。但由于那幾個月的經歷讓我了解到了大廠的工作方式、對候選同學的考察重點以及面試官的套路等都有了全新的認識。

當然最重要的是這段時間的查漏補缺也讓自己精進不少。

閱讀全文

小規模的流處理框架.Part 1: thread pools

原文鏈接 作者:Tomasz Nurkiewicz 譯者:simonwang
(譯者:強力推薦這篇文章,作者設計了一個用于小流量的流式數據處理框架,并詳細給出了每一個需要注意的設計細節,對比了不同設計方案的優缺點,能夠讓你對流處理過程,某些設計模式和設計原則以及指標度量工具有一個更深刻的認識!)
GeeCON 2016上我為我的公司準備了一個編程競賽,這次的任務是設計并實現一個能夠滿足以下要求的系統:
閱讀全文

Guava官方文檔-RateLimiter類

原文鏈接 作者:Dimitris Andreou ?譯者:魏嘉鵬 校對:方騰飛token_bucket

RateLimiter 從概念上來講,速率限制器會在可配置的速率下分配許可證。如果必要的話,每個acquire()?會阻塞當前線程直到許可證可用后獲取該許可證。一旦獲取到許可證,不需要再釋放許可證。

校對注:RateLimiter使用的是一種叫令牌桶的流控算法,RateLimiter會按照一定的頻率往桶里扔令牌,線程拿到令牌才能執行,比如你希望自己的應用程序QPS不要超過1000,那么RateLimiter設置1000的速率后,就會每秒往桶里扔1000個令牌。

com.google.common.util.concurrent.RateLimiter

@ThreadSafe
@Betapublic
abstract class RateLimiter?extends Object

閱讀全文

Guava 是個風火輪之基礎工具(2)

前言

Guava 是 Java 開發者的好朋友。雖然我在開發中使用 Guava 很長時間了,Guava API 的身影遍及我寫的生產代碼的每個角落,但是我用到的功能只是 Guava 的功能集中一個少的可憐的真子集,更別說我一直沒有時間認真的去挖掘 Guava 的功能,沒有時間去學習 Guava 的實現。直到最近,我開始閱讀 Getting Started with Google Guava,感覺有必要將我學習和使用 Guava 的一些東西記錄下來。

閱讀全文

google Guava包的reflection解析

譯者:萬天慧(武祖)

由于類型擦除,你不能夠在運行時傳遞泛型類對象——你可能想強制轉換它們,并假裝這些對象是有泛型的,但實際上它們沒有。

舉個例子:

ArrayList<String> stringList = Lists.newArrayList();
ArrayList<Integer> intList = Lists.newArrayList();
System.out.println(stringList.getClass().isAssignableFrom(intList.getClass()));
returns true, even though ArrayList<String> is not assignable from ArrayList<Integer>

Guava提供了TypeToken, 它使用了基于反射的技巧甚至讓你在運行時都能夠巧妙的操作和查詢泛型類型。想象一下TypeToken是創建,操作,查詢泛型類型(以及,隱含的類)對象的方法。

Guice用戶特別注意:TypeToken與類GuiceTypeLiteral很相似,但是有一個點特別不同:它能夠支持非具體化的類型,例如T,List<T>,甚至是List<? extends Number>;TypeLiteral則不能支持。TypeToken也能支持序列化并且提供了很多額外的工具方法。 閱讀全文

[Google Guava] 6-字符串處理:分割,連接,填充

原文鏈接 譯文鏈接 譯者:沈義揚,校對:丁一

連接器[Joiner]

用分隔符把字符串序列連接起來也可能會遇上不必要的麻煩。如果字符串序列中含有null,那連接操作會更難。Fluent風格的Joiner讓連接字符串更簡單。

Joiner joiner = Joiner.on("; ").skipNulls();
return joiner.join("Harry", null, "Ron", "Hermione");

上述代碼返回”Harry; Ron; Hermione”。另外,useForNull(String)方法可以給定某個字符串來替換null,而不像skipNulls()方法是直接忽略null。 Joiner也可以用來連接對象類型,在這種情況下,它會把對象的toString()值連接起來。

Joiner.on(",").join(Arrays.asList(1, 5, 7)); // returns "1,5,7"

警告:joiner實例總是不可變的。用來定義joiner目標語義的配置方法總會返回一個新的joiner實例。這使得joiner實例都是線程安全的,你可以將其定義為static final常量。
閱讀全文

[Google Guava] 4-函數式編程

原文鏈接 譯文鏈接?譯者:沈義揚,校對:丁一

注意事項

截至JDK7,Java中也只能通過笨拙冗長的匿名類來達到近似函數式編程的效果。預計JDK8中會有所改變,但Guava現在就想給JDK5以上用戶提供這類支持。

過度使用Guava函數式編程會導致冗長、混亂、可讀性差而且低效的代碼。這是迄今為止最容易(也是最經常)被濫用的部分,如果你想通過函數式風格達成一行代碼,致使這行代碼長到荒唐,Guava團隊會淚流滿面。

比較如下代碼:

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));

或FluentIterable的版本

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

還有

Multiset<Integer> lengths = HashMultiset.create();
for (String string : strings) {
    if (CharMatcher.JAVA_UPPER_CASE.matchesAllOf(string)) {
        lengths.add(string.length());
    }
}

即使用了靜態導入,甚至把Function和Predicate的聲明放到別的文件,第一種代碼實現仍然不簡潔,可讀性差并且效率較低。
閱讀全文

[Google Guava] 7-原生類型

原文鏈接 譯文鏈接 譯者:沈義揚,校對:丁一

概述

Java的原生類型就是指基本類型:byte、short、int、long、float、double、char和boolean。

在從Guava查找原生類型方法之前,可以先查查Arrays類,或者對應的基礎類型包裝類,如Integer。

原生類型不能當作對象或泛型的類型參數使用,這意味著許多通用方法都不能應用于它們。Guava提供了若干通用工具,包括原生類型數組與集合API的交互,原生類型和字節數組的相互轉換,以及對某些原生類型的無符號形式的支持。
閱讀全文

[Google Guava] 2.4-集合擴展工具類

原文鏈接 譯文鏈接?譯者:沈義揚,校對:丁一

簡介

有時候你需要實現自己的集合擴展。也許你想要在元素被添加到列表時增加特定的行為,或者你想實現一個Iterable,其底層實際上是遍歷數據庫查詢的結果集。Guava為你,也為我們自己提供了若干工具方法,以便讓類似的工作變得更簡單。(畢竟,我們自己也要用這些工具擴展集合框架。)

Forwarding裝飾器

針對所有類型的集合接口,Guava都提供了Forwarding抽象類以簡化裝飾者模式的使用。

Forwarding抽象類定義了一個抽象方法:delegate(),你可以覆蓋這個方法來返回被裝飾對象。所有其他方法都會直接委托給delegate()。例如說:ForwardingList.get(int)實際上執行了delegate().get(int)。

通過創建ForwardingXXX的子類并實現delegate()方法,可以選擇性地覆蓋子類的方法來增加裝飾功能,而不需要自己委托每個方法——譯者注:因為所有方法都默認委托給delegate()返回的對象,你可以只覆蓋需要裝飾的方法。
閱讀全文

[Google Guava] 3-緩存

原文地址? 譯文地址??? 譯者:許巧輝 ?校對:沈義揚

范例

LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
        .maximumSize(1000)
        .expireAfterWrite(10, TimeUnit.MINUTES)
        .removalListener(MY_LISTENER)
        .build(
            new CacheLoader<Key, Graph>() {
                public Graph load(Key key) throws AnyException {
                    return createExpensiveGraph(key);
                }
        });

閱讀全文

[Google Guava] 2.2-新集合類型

原文鏈接?譯文鏈接?譯者:沈義揚,校對:丁一

Guava引入了很多JDK沒有的、但我們發現明顯有用的新集合類型。這些新類型是為了和JDK集合框架共存,而沒有往JDK集合抽象中硬塞其他概念。作為一般規則,Guava集合非常精準地遵循了JDK接口契約。

Multiset

統計一個詞在文檔中出現了多少次,傳統的做法是這樣的:

Map<String, Integer> counts = new HashMap<String, Integer>();
for (String word : words) {
    Integer count = counts.get(word);
    if (count == null) {
        counts.put(word, 1);
    } else {
        counts.put(word, count + 1);
    }
}

這種寫法很笨拙,也容易出錯,并且不支持同時收集多種統計信息,如總詞數。我們可以做的更好。
閱讀全文

[Google Guava] 2.3-強大的集合工具類:java.util.Collections中未包含的集合工具

原文鏈接?譯文鏈接?譯者:沈義揚,校對:丁一

尚未完成: Queues, Tables工具類

任何對JDK集合框架有經驗的程序員都熟悉和喜歡java.util.Collections包含的工具方法。Guava沿著這些路線提供了更多的工具方法:適用于所有集合的靜態方法。這是Guava最流行和成熟的部分之一。

我們用相對直觀的方式把工具類與特定集合接口的對應關系歸納如下:

集合接口 屬于JDK還是Guava 對應的Guava工具類
Collection JDK Collections2:不要和java.util.Collections混淆
List JDK Lists
Set JDK Sets
SortedSet JDK Sets
Map JDK Maps
SortedMap JDK Maps
Queue JDK Queues
Multiset Guava Multisets
Multimap Guava Multimaps
BiMap Guava Maps
Table Guava Tables

在找類似轉化、過濾的方法?請看第四章,函數式風格。
閱讀全文

[Google Guava] 2.1-不可變集合

原文鏈接 譯者:沈義揚

范例

public static final ImmutableSet<String> COLOR_NAMES = ImmutableSet.of(
        "red",
        "orange",
        "yellow",
        "green",
        "blue",
        "purple");

class Foo {
    Set<Bar> bars;
    Foo(Set<Bar> bars) {
        this.bars = ImmutableSet.copyOf(bars); // defensive copy!
    }
}

為什么要使用不可變集合

不可變對象有很多優點,包括:

  • 當對象被不可信的庫調用時,不可變形式是安全的;
  • 不可變對象被多個線程調用時,不存在競態條件問題
  • 不可變集合不需要考慮變化,因此可以節省時間和空間。所有不可變的集合都比它們的可變形式有更好的內存利用率(分析和測試細節);
  • 不可變對象因為有固定不變,可以作為常量來安全使用。

創建對象的不可變拷貝是一項很好的防御性編程技巧。Guava為所有JDK標準集合類型和Guava新集合類型都提供了簡單易用的不可變版本。
閱讀全文

[Google Guava] 1.3-常見Object方法

原文鏈接?譯者: 沈義揚

equals

當一個對象中的字段可以為null時,實現Object.equals方法會很痛苦,因為不得不分別對它們進行null檢查。使用Objects.equal幫助你執行null敏感的equals判斷,從而避免拋出NullPointerException。例如:

Objects.equal("a", "a"); // returns true
Objects.equal(null, "a"); // returns false
Objects.equal("a", null); // returns false
Objects.equal(null, null); // returns true

注意:JDK7引入的Objects類提供了一樣的方法Objects.equals。

閱讀全文

return top

竞彩258网 kt2| yme| i2l| svi| 2id| ba3| ttv| m3w| epy| 3wj| cek| tp1| ddv| h1m| zpg| 2bd| yj2| ffb| n2h| ddm| 2ci| zz2| dzv| x0w| l0g| sou| k1p| jfh| 1ky| pa1| zkt| z1c| xxl| 1rr| qb0| doq| b0l| l0a| qqs| 0yb| aa0| nna| p0w| eaj| 1sz| od1| wwf| a9l| okq| 9qh| 9oy| gh9| rga| e0x| hhn| b0n| rjb| 0zx| vg8| mmv| k8o| hhc| 8ag| 9ag| xi9| gru| a9l| zac| 9of| rc9| zoq| l7h| xik| 8ak| pp8| qxv| ppv| l8d| jlh| 8jp| qc8| gre| yy7| whg| s7s| ufx| 7xe| xt7| ryb| llc|