<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # Google Guava 簡介 原文:http://zetcode.com/articles/guava/ 本教程是 Guava 庫的簡介。 我們看一下 Guava 庫的一些有趣的功能。 ## Guava Google Guava 是 Java 通用庫的開源集合,主要由 Google 工程師開發。 Google 有許多 Java 項目。 Guava 是解決那些項目中遇到的許多常見問題的解決方案,其中包括集合,數學,函數習語,輸入&輸出和字符串等領域。 Guava 的某些功能已經包含在 JDK 中。 例如`String.join()`方法已引入 JDK 8。 ## Guava Maven 依賴 在我們的示例中,我們使用以下 Maven 依賴關系。 ```java <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>19.0</version> </dependency> ``` ## Guava 初始化集合 Guava 允許在一行中初始化集合。 JDK 8 不支持集合字面值。 `InitializeCollectionEx.java` ```java package com.zetcode.initializecollectionex; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import java.util.List; import java.util.Map; public class InitializeCollectionEx { public static void main(String[] args) { Map items = ImmutableMap.of("coin", 3, "glass", 4, "pencil", 1); items.entrySet() .stream() .forEach(System.out::println); List<String> fruits = Lists.newArrayList("orange", "banana", "kiwi", "mandarin", "date", "quince"); for (String fruit: fruits) { System.out.println(fruit); } } } ``` 在示例中,我們使用 Guava 的工廠方法創建映射和列表。 ```java Map items = ImmutableMap.of("coin", 3, "glass", 4, "pencil", 1); ``` 使用`ImmutableMap.of()`方法創建一個新映射。 ```java List<String> fruits = Lists.newArrayList("orange", "banana", "kiwi", "mandarin", "date", "quince"); ``` 使用`Lists.newArrayList()`方法創建一個新的字符串列表。 ```java coin=3 glass=4 pencil=1 orange banana kiwi mandarin date quince ``` 這是示例的輸出。 ## Guava `MoreObjects.toStringHelper()` `MoreObjects.toStringHelper()`有助于輕松創建具有一致格式的`toString()`方法,它使我們可以控制所包含的字段。 `Car.java` ```java package com.zetcode.tostringex.beans; import com.google.common.base.MoreObjects; public class Car { private long Id; private String Name; private int Price; public Car(long Id, String Name, int Price) { this.Id = Id; this.Name = Name; this.Price = Price; } public long getId() { return Id; } public void setId(long Id) { this.Id = Id; } public String getName() { return Name; } public void setName(String Name) { this.Name = Name; } public int getPrice() { return Price; } public void setPrice(int Price) { this.Price = Price; } @Override public String toString() { return MoreObjects.toStringHelper(Car.class) .add("id", Id) .add("name", Name) .add("price", Price) .toString(); } } ``` 這是一個`Car` bean。 它包含`toString()`方法,該方法給出對象的字符串表示形式。 ```java @Override public String toString() { return MoreObjects.toStringHelper(Car.class) .add("id", Id) .add("name", Name) .add("price", Price) .toString(); } ``` 除了使用字符串之外,我們還提供了`MoreObjects.toStringHelper()`方法更簡潔的解決方案。 `ToStringEx.java` ```java package com.zetcode.tostringex; import com.zetcode.tostringex.beans.Car; public class ToStringEx { public static void main(String[] args) { Car car1 = new Car(1, "Audi", 52642); Car car2 = new Car(2, "Mercedes", 57127); Car car3 = new Car(3, "Skoda", 9000); System.out.println(car1); System.out.println(car2); System.out.println(car3); } } ``` 我們創建三個汽車對象,并將它們傳遞給`System.out.println()`方法。 該方法調用對象的`toString()`方法。 ```java Car{id=1, name=Audi, price=52642} Car{id=2, name=Mercedes, price=57127} Car{id=3, name=Skoda, price=9000} ``` This is the output of the example. ## Guava `FluentIterable` `FluentIterable`提供了一個強大而簡單的 API,可以流暢地操作`Iterable`實例。 它允許我們以各種方式過濾和轉換集合。 `Car.java` ```java package com.zetcode.fluentiterable.beans; import com.google.common.base.MoreObjects; public class Car { private long Id; private String Name; private int Price; public Car(long Id, String Name, int Price) { this.Id = Id; this.Name = Name; this.Price = Price; } public long getId() { return Id; } public void setId(long Id) { this.Id = Id; } public String getName() { return Name; } public void setName(String Name) { this.Name = Name; } public int getPrice() { return Price; } public void setPrice(int Price) { this.Price = Price; } @Override public String toString() { return MoreObjects.toStringHelper(Car.class) .add("id", Id) .add("name", Name) .add("price", Price) .toString(); } } ``` 在此示例中,我們有一個`Car` bean。 `FluentIterableEx.java` ```java package com.zetcode.fluentiterable; import com.google.common.base.Functions; import com.google.common.base.Predicate; import com.google.common.collect.FluentIterable; import com.google.common.collect.Lists; import com.zetcode.fluentiterable.beans.Car; import java.util.List; public class FluentIterableEx { public static void main(String[] args) { List<Car> cars = Lists.newArrayList(new Car(1, "Audi", 52642), new Car(2, "Mercedes", 57127), new Car(3, "Skoda", 9000), new Car(4, "Volvo", 29000)); Predicate<Car> byPrice = car -> car.getPrice() <= 30000; List<String> results = FluentIterable.from(cars) .filter(byPrice) .transform(Functions.toStringFunction()) .toList(); System.out.println(results); } } ``` 在代碼示例中,我們有一個汽車對象列表。 我們通過將列表減少為僅適用于價格低于 30000 輛的汽車來對其進行改造。 ```java List<Car> cars = Lists.newArrayList(new Car(1, "Audi", 52642), new Car(2, "Mercedes", 57127), new Car(3, "Skoda", 9000), new Car(4, "Volvo", 29000)); ``` 創建`Car`對象的列表。 JDK 中沒有集合字面值。 我們使用 Guava 中的`Lists.newArrayList()`初始化列表。 ```java Predicate<Car> byPrice = car -> car.getPrice() <= 30000; ``` 創建了`Predicate`。 謂詞是一個返回布爾值的函數。 該謂詞確定汽車是否比 30000 便宜。 ```java List<String> results = FluentIterable.from(cars) .filter(byPrice) .transform(Functions.toStringFunction()) .toList(); ``` 從`cars`集合創建一個`FluentIterable`。 謂詞函數應用于`FluentIterable`。 檢索到的元素將轉換為元素列表; 元素是從`toString()`函數返回的字符串。 ```java [Car{id=3, name=Skoda, price=9000}, Car{id=4, name=Volvo, price=29000}] ``` This is the output of the example. ## Guava 謂詞 一般而言,謂詞是關于正確或錯誤的陳述。 如果要測試的對象引用不是`null`,則`Predicates.notNull()`返回一個求值為`true`的謂詞。 `PredicateEx.java` ```java package com.zetcode.predicateex; import com.google.common.base.Predicates; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import java.util.List; public class PredicateEx { public static void main(String[] args) { List<Integer> values = Lists.newArrayList(3, null, 4, 7, 8, null, 7); Iterable<Integer> filtered = Iterables.filter(values, Predicates.notNull()); for (Integer i: filtered) { System.out.println(i); } } } ``` 在第一個示例中,我們使用謂詞從集合中排除`null`值。 ```java List<Integer> values = Lists.newArrayList(3, null, 4, 7, 8, null, 7); ``` 使用 Guava 的`Lists.newArrayList()`,我們創建了`Integer`值的列表。 該列表包含兩個`nulls`。 ```java Iterable<Integer> filtered = Iterables.filter(values, Predicates.notNull()); ``` 我們通過應用`Predicates.notNull()`過濾值。 `Iterables.filter`返回一個可迭代的對象。 ```java for (Integer i: filtered) { System.out.println(i); } ``` 我們遍歷過濾列表并打印其元素。 ```java 3 4 7 8 7 ``` This is the output of the example. 第二個示例按特定的文本模式過濾集合。 在編程中,謂詞通常用于過濾數據。 `PredicateEx2.java` ```java package com.zetcode.predicateex; import com.google.common.base.Predicates; import com.google.common.collect.Collections2; import com.google.common.collect.Lists; import java.util.Collection; import java.util.List; public class PredicateEx2 { public static void main(String[] args) { List<String> items = Lists.newArrayList("coin", "book", "cup", "purse", "bottle"); Collection<String> result = Collections2.filter(items, Predicates.containsPattern("o")); for (String item: result) { System.out.println(item); } } } ``` 該代碼示例創建一個項目列表,然后按特定模式過濾該列表。 ```java Collection<String> result = Collections2.filter(items, Predicates.containsPattern("o")); ``` `Predicates.containsPattern()`返回一個謂詞,該謂詞查找包含字符`"o"`的項目。 謂詞將傳遞給`Collections2.filter()`方法。 ```java coin book bottle ``` 這三個詞符合標準。 ## Guava `readLines()` `Files.readLines()`允許一次性讀取文件中的所有行。 ![NetBeans project structure](https://img.kancloud.cn/69/b8/69b8222dd7fcce1ff6e658c05a4053e7_238x235.jpg) 圖:NetBeans 項目結構 該圖顯示了項目結構在 NetBeans 中的外觀。 `balzac.txt` ```java Honoré de Balzac, original name Honoré Balzac (born May 20, 1799, Tours, France—died August 18, 1850, Paris) French literary artist who produced a vast number of novels and short stories collectively called La Comédie humaine (The Human Comedy). He helped to establish the traditional form of the novel and is generally considered to be one of the greatest novelists of all time. ``` 我們在`src/main/resources`目錄中有此文本文件。 `ReadingLinesEx.java` ```java package com.zetcode.readinglinesex; import com.google.common.base.Charsets; import com.google.common.io.Files; import java.io.File; import java.io.IOException; import java.util.List; public class ReadingLinesEx { public static void main(String[] args) throws IOException { String fileName = "src/main/resources/balzac.txt"; List<String> lines = Files.readLines(new File(fileName), Charsets.UTF_8); for (String line: lines) { System.out.println(line); } } } ``` 該示例從`balzac.txt`文件讀取所有行,并將它們打印到控制臺。 ```java String fileName = "src/main/resources/balzac.txt"; ``` 文件名位于`src/main/resource`目錄中。 ```java List<String> lines = Files.readLines(new File(fileName), Charsets.UTF_8); ``` 使用`Files.readLines()`方法,我們從`balzac.txt`文件中讀取所有行。 這些行存儲在字符串列表中。 ```java for (String line: lines) { System.out.println(line); } ``` 我們遍歷列表并打印其元素。 ## 使用 Guava 創建一個新文件 `Files.touch()`方法用于創建新文件或更新現有文件上的時間戳。 該方法類似于 Unix `touch`命令。 `TouchFileEx.java` ```java package com.zetcode.touchfileex; import com.google.common.io.Files; import java.io.File; import java.io.IOException; public class TouchFileEx { public static void main(String[] args) throws IOException { String newFileName = "newfile.txt"; Files.touch(new File(newFileName)); } } ``` 該示例在項目的根目錄中創建`newfile.txt`。 ## 用 Guava 寫入文件 `Files.write()`方法將數據寫入文件。 `WriteToFileEx.java` ```java package com.zetcode.writetofileex; import com.google.common.io.Files; import java.io.File; import java.io.IOException; public class WriteToFileEx { public static void main(String[] args) throws IOException { String fileName = "fruits.txt"; File file = new File(fileName); String content = "banana, orange, lemon, apple, plum"; Files.write(content.getBytes(), file); } } ``` 該示例將由水果名稱組成的字符串寫入`fruits.txt`文件。 該文件在項目根目錄中創建。 ## 用 Guava 連接字符串 `Joiner`用分隔符將文本片段(指定為數組,`Iterable`,可變參數或`Map`)連接在一起。 `StringJoinerEx.java` ```java package com.zetcode.stringjoinerex; import com.google.common.base.Joiner; import com.google.common.collect.Lists; import java.util.List; public class StringJoinerEx { public static void main(String[] args) { List<String> myList = Lists.newArrayList("8", "2", "7", "10"); String result = Joiner.on(",").join(myList); System.out.println(result); } } ``` 在示例中,我們用逗號將列表中的元素連接起來。 ```java 8,2,7,10 ``` This is the output of the example. ## 用 Guava 分割字符串 `Splitter`通過識別分隔符序列的出現,從輸入字符串中提取不重疊的子字符串。 `StringSplitterEx.java` ```java package com.zetcode.stringsplitterex; import com.google.common.base.Splitter; import java.util.List; public class StringSplitterEx { public static void main(String[] args) { String input = "There is a dog in the garden."; List<String> words = Splitter.on(" ").splitToList(input); for (String word: words) { System.out.println(word); } } } ``` 該示例使用`Splitter`將句子拆分為單詞。 ```java String input = "There is a dog in the garden."; ``` 我們有一個由七個詞組成的句子。 ```java List<String> words = Splitter.on(" ").splitToList(input); ``` 分隔符是一個空格字符。 `splitToList()`方法將輸入拆分為字符串列表。 第二個示例將輸入分為三個子字符串。 `StringSplitterEx2.java` ```java package com.zetcode.stringsplitterex2; import com.google.common.base.Splitter; import java.util.List; public class StringSplitterEx2 { public static void main(String[] args) { String input = "coin, pencil, chair, bottle, soap"; List<String> words = Splitter.on(",") .trimResults() .limit(3) .splitToList(input); for (String word: words) { System.out.println(word); } } } ``` 此外,還對單詞進行了修剪。 ```java coin pencil chair, bottle, soap ``` 這是輸出。 ## Guava 先決條件 前提條件是簡單的靜態方法,將在我們自己的方法開始時調用它們以驗證正確的參數和狀態。 該方法在失敗時拋出`IllegalArgumentException`。 `PreconditionsEx.java` ```java package com.zetcode.preconditionex; import static com.google.common.base.Preconditions.checkArgument; import com.google.common.base.Splitter; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.List; public class PreconditionsEx { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Enter items: "); String input = br.readLine(); List<String> items = Splitter.on(" ").splitToList(input); OutputItems(items); } public static void OutputItems(List<String> items) { checkArgument(items != null, "The list must not be null"); checkArgument(!items.isEmpty(), "The list must not be empty"); for (String item: items) { System.out.println(item); } } } ``` 該示例使用兩個前提條件。 ```java BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Enter items: "); String input = br.readLine(); ``` 我們從用戶那里讀取輸入。 我們希望有一個單詞列表。 ```java List<String> items = Splitter.on(" ").splitToList(input); OutputItems(items); ``` 將指定的單詞拆分為一個列表,并將該列表傳遞給`OutputItems()`方法 ```java checkArgument(items != null, "The list must not be null"); checkArgument(!items.isEmpty(), "The list must not be empty"); ``` 在`OutputItems()`方法中,我們檢查列表是否不為空。 使用`checkArgument()`方法,我們可以確保表達式的有效性; 例如該列表不為空。 ## 用 Guava 計算階乘 Guava 還提供用于進行數學計算的工具。 `BigIntegerMath.factorial()`計算階乘。 `FactorialEx.java` ```java package com.zetcode.factorialex; import com.google.common.math.BigIntegerMath; public class FactorialEx { public static void main(String[] args) { System.out.println(BigIntegerMath.factorial(100)); } } ``` 該示例顯示數字 100 的階乘。 ```java 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000 ``` This is the output of the example. ## 用 Guava 計算二項式 `BigIntegerMath.binomial()`返回`n`和`k`的二項式系數。 `FactorialEx.java` ```java package com.zetcode.binomialex; import com.google.common.math.BigIntegerMath; import java.math.BigInteger; public class BinomialEx { public static void main(String[] args) { BigInteger bigInt = BigIntegerMath.binomial(4, 2); System.out.println(bigInt); } } ``` 該示例顯示 4 和 2 的二項式。 ## Guava `CharMatcher` `CharMatcher`提供了一些基本的文本處理方法。 `CharMatcherEx.java` ```java package com.zetcode.charmatcherex; import com.google.common.base.CharMatcher; public class CharMatcherEx { public static void main(String[] args) { String input = "Peter17"; CharMatcher matcher = CharMatcher.JAVA_LETTER; String result = matcher.retainFrom(input); System.out.println(result); } } ``` 該示例從輸入字符串中刪除所有非字母字符。 `retainFrom()`方法按順序返回包含字符序列的所有匹配字符的字符串。 ```java Peter ``` 兩位數字被刪除。 在第二個示例中,我們計算輸入字符串中的字符數。 `CharMatcherEx2.java` ```java package com.zetcode.charmatcherex2; import com.google.common.base.CharMatcher; public class CharMatcherEx2 { public static void main(String[] args) { String input = "Beautiful sunny day"; int n1 = CharMatcher.is('n').countIn(input); System.out.format("Number of n characters: %d%n", n1); int n2 = CharMatcher.is('i').countIn(input); System.out.format("Number of i characters: %d", n2); } } ``` 該示例計算輸入字符串中'n'和'i'字符的數量。 ```java int n1 = CharMatcher.is('n').countIn(input); ``` `countIn()`方法返回在字符序列中找到的匹配字符數。 ```java Number of n characters: 2 Number of i characters: 1 ``` This is the output of the example. `CharMatcher.whitespace()`確定字符是否為空格。 `CharMatcherEx3.java` ```java package com.zetcode.charmatcherex3; import com.google.common.base.CharMatcher; public class CharMatcherEx3 { public static void main(String[] args) { String input = " yogurt \t"; String result = CharMatcher.whitespace().trimFrom(input); System.out.println(input + " and bread" ); System.out.println(result + " and bread"); } } ``` 在第三個示例中,我們從字符串中刪除空格。 ```java String result = CharMatcher.whitespace().trimFrom(input); ``` 空格從輸入字符串中刪除。 ```java yogurt and bread yogurt and bread ``` This is the output of the example. ## Guava `Range` `Range`可以輕松創建各種范圍。 范圍或間隔定義了連續值范圍周圍的邊界; 例如 1 到 10 之間的整數(含 1 和 10)。 `RangeEx.java` ```java package com.zetcode.rangeex; import com.google.common.collect.Range; public class RangeEx { public static void main(String[] args) { Range<Integer> range1 = Range.closed(3, 8); System.out.println(range1); Range<Integer> range2 = Range.openClosed(3, 8); System.out.println(range2); Range<Integer> range3 = Range.closedOpen(3, 8); System.out.println(range3); } } ``` 在示例中,我們創建了三個整數間隔。 ```java [3‥8] (3‥8] [3‥8) ``` This is the output of the example. 在本文中,我們使用了 Google Guava 庫。 您可能也對以下相關教程感興趣:[用 Java 閱讀文本文件](/articles/javareadtext/), [Java 教程](/lang/java/),[用 Java 過濾列表](/articles/javafilterlist/), [Java8 的`StringJoiner`](/articles/java8stringjoiner/)或 [Opencsv 教程](/articles/opencsv/)。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看