{"id":681,"date":"2023-02-26T14:39:09","date_gmt":"2023-02-26T06:39:09","guid":{"rendered":"https:\/\/www.appblog.cn\/?p=681"},"modified":"2023-04-29T18:22:04","modified_gmt":"2023-04-29T10:22:04","slug":"introduction-and-use-of-google-guava-tool-class","status":"publish","type":"post","link":"https:\/\/www.appblog.cn\/index.php\/2023\/02\/26\/introduction-and-use-of-google-guava-tool-class\/","title":{"rendered":"Google Guava\u5de5\u5177\u7c7b\u7684\u4ecb\u7ecd\u548c\u4f7f\u7528"},"content":{"rendered":"<h2>\u6982\u8ff0<\/h2>\n<p>\u5de5\u5177\u7c7b\uff0c\u5c31\u662f\u5c01\u88c5\u5e73\u5e38\u7528\u7684\u65b9\u6cd5\uff0c\u4e0d\u9700\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u8282\u7701\u5f00\u53d1\u4eba\u5458\u65f6\u95f4\uff0c\u63d0\u9ad8\u5de5\u4f5c\u6548\u7387\u3002\u8c37\u6b4c\u4f5c\u4e3a\u5927\u516c\u53f8\uff0c\u5f53\u7136\u4f1a\u4ece\u65e5\u5e38\u7684\u5de5\u4f5c\u4e2d\u63d0\u53d6\u4e2d\u5f88\u591a\u9ad8\u6548\u7387\u7684\u65b9\u6cd5\u51fa\u6765\u3002\u6240\u4ee5\u5c31\u8bde\u751f\u4e86guava\u3002<\/p>\n<p>Guava\u6587\u6863\uff1a<a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/github.com\/google\/guava\/wiki\">https:\/\/github.com\/google\/guava\/wiki<\/a><\/p>\n<p><!-- more --><\/p>\n<p>Guava\u7684\u4f18\u70b9\uff1a<\/p>\n<ul>\n<li>\u9ad8\u6548\u8bbe\u8ba1\u826f\u597d\u7684API\uff0c\u88abGoogle\u7684\u5f00\u53d1\u8005\u8bbe\u8ba1\uff0c\u5b9e\u73b0\u548c\u4f7f\u7528<\/li>\n<li>\u9075\u5faa\u9ad8\u6548\u7684java\u8bed\u6cd5\u5b9e\u8df5<\/li>\n<li>\u4f7f\u4ee3\u7801\u66f4\u523b\u5ea6\uff0c\u7b80\u6d01\uff0c\u7b80\u5355<\/li>\n<li>\u8282\u7ea6\u65f6\u95f4\uff0c\u8d44\u6e90\uff0c\u63d0\u9ad8\u751f\u4ea7\u529b<\/li>\n<\/ul>\n<p>Guava\u5de5\u7a0b\u5305\u542b\u4e86\u82e5\u5e72\u88abGoogle\u7684 Java\u9879\u76ee\u5e7f\u6cdb\u4f9d\u8d56 \u7684\u6838\u5fc3\u5e93\uff0c\u4f8b\u5982\uff1a<\/p>\n<ul>\n<li>\u96c6\u5408 [collections]<\/li>\n<li>\u7f13\u5b58 [caching]<\/li>\n<li>\u539f\u751f\u7c7b\u578b\u652f\u6301 [primitives support]<\/li>\n<li>\u5e76\u53d1\u5e93 [concurrency libraries]<\/li>\n<li>\u901a\u7528\u6ce8\u89e3 [common annotations]<\/li>\n<li>\u5b57\u7b26\u4e32\u5904\u7406 [string processing]<\/li>\n<li>I\/O \u7b49\u7b49<\/li>\n<\/ul>\n<h2>\u4f7f\u7528<\/h2>\n<p>\u5f15\u5165Gradle\u4f9d\u8d56<\/p>\n<pre><code>compile &#039;com.google.guava:guava:30.0-jre&#039;<\/code><\/pre>\n<p>\u5f15\u5165Maven\u4f9d\u8d56<\/p>\n<pre><code class=\"language-xml\">&lt;!-- https:\/\/mvnrepository.com\/artifact\/com.google.guava\/guava --&gt;\n&lt;dependency&gt;\n    &lt;groupId&gt;com.google.guava&lt;\/groupId&gt;\n    &lt;artifactId&gt;guava&lt;\/artifactId&gt;\n    &lt;version&gt;30.0-jre&lt;\/version&gt;\n&lt;\/dependency&gt;<\/code><\/pre>\n<h3>\u96c6\u5408\u7684\u521b\u5efa<\/h3>\n<pre><code class=\"language-java\">\/\/ \u666e\u901aCollection\u7684\u521b\u5efa\nList&lt;String&gt; list = Lists.newArrayList();\nSet&lt;String&gt; set = Sets.newHashSet();\nMap&lt;String, String&gt; map = Maps.newHashMap();\n\n\/\/ \u4e0d\u53d8Collection\u7684\u521b\u5efa\nImmutableList&lt;String&gt; iList = ImmutableList.of(&quot;a&quot;, &quot;b&quot;, &quot;c&quot;);\nImmutableSet&lt;String&gt; iSet = ImmutableSet.of(&quot;e1&quot;, &quot;e2&quot;);\nImmutableMap&lt;String, String&gt; iMap = ImmutableMap.of(&quot;k1&quot;, &quot;v1&quot;, &quot;k2&quot;, &quot;v2&quot;);<\/code><\/pre>\n<p>\u521b\u5efa\u4e0d\u53ef\u53d8\u96c6\u5408\uff0c\u5148\u7406\u89e3\u4ec0\u4e48\u662fimmutable(\u4e0d\u53ef\u53d8)\u5bf9\u8c61<\/p>\n<ul>\n<li>\u5728\u591a\u7ebf\u7a0b\u64cd\u4f5c\u4e0b\uff0c\u662f\u7ebf\u7a0b\u5b89\u5168\u7684<\/li>\n<li>\u6240\u6709\u4e0d\u53ef\u53d8\u96c6\u5408\u4f1a\u6bd4\u53ef\u53d8\u96c6\u5408\u66f4\u6709\u6548\u7684\u5229\u7528\u8d44\u6e90<\/li>\n<li>\u4e2d\u9014\u4e0d\u53ef\u6539\u53d8<\/li>\n<\/ul>\n<pre><code class=\"language-java\">ImmutableList&lt;String&gt; immutableList = ImmutableList.of(&quot;1&quot;,&quot;2&quot;,&quot;3&quot;,&quot;4&quot;);<\/code><\/pre>\n<p>\u8fd9\u58f0\u660e\u4e86\u4e00\u4e2a\u4e0d\u53ef\u53d8\u7684List\u96c6\u5408\uff0cList\u4e2d\u6709\u6570\u636e1\uff0c2\uff0c3\uff0c4\u3002\u7c7b\u4e2d\u7684\u64cd\u4f5c\u96c6\u5408\u7684\u65b9\u6cd5\uff08\u8b6c\u5982add, set, sort, replace\u7b49\uff09\u90fd\u88ab\u58f0\u660e\u8fc7\u671f\uff0c\u5e76\u4e14\u629b\u51fa\u5f02\u5e38\u3002\u800c\u6ca1\u7528guava\u4e4b\u524d\u662f\u9700\u8981\u58f0\u660e\u5e76\u4e14\u52a0\u5404\u79cd\u5305\u88f9\u96c6\u5408\u624d\u80fd\u5b9e\u73b0\u8fd9\u4e2a\u529f\u80fd<\/p>\n<pre><code class=\"language-java\">\/\/ add \u65b9\u6cd5\n@Deprecated @Override\npublic final void add(int index, E element) {\n    throw new UnsupportedOperationException();\n}<\/code><\/pre>\n<p>\u5f53\u6211\u4eec\u9700\u8981\u4e00\u4e2amap\u4e2d\u5305\u542bkey\u4e3aString\u7c7b\u578b\uff0cvalue\u4e3aList\u7c7b\u578b\u7684\u65f6\u5019\uff0c\u4ee5\u524d\u6211\u4eec\u662f\u8fd9\u6837\u5199\u7684<\/p>\n<pre><code class=\"language-java\">Map&lt;String,List&lt;Integer&gt;&gt; map = new HashMap&lt;String, List&lt;Integer&gt;&gt;();\nList&lt;Integer&gt; list = new ArrayList&lt;Integer&gt;();\nlist.add(1);\nlist.add(2);\nmap.put(&quot;aa&quot;, list);\nSystem.out.println(map.get(&quot;aa&quot;));  \/\/[1, 2]<\/code><\/pre>\n<p>\u800c\u73b0\u5728<\/p>\n<pre><code class=\"language-java\">Multimap&lt;String, Integer&gt; map = ArrayListMultimap.create();      \nmap.put(&quot;aa&quot;, 1);\nmap.put(&quot;aa&quot;, 2);\nSystem.out.println(map.get(&quot;aa&quot;));  \/\/[1, 2]<\/code><\/pre>\n<p>\u5176\u4ed6\u7684\u9ed1\u79d1\u6280\u96c6\u5408<\/p>\n<pre><code class=\"language-java\">MultiSet: \u65e0\u5e8f+\u53ef\u91cd\u590d count()\u65b9\u6cd5\u83b7\u53d6\u5355\u8bcd\u7684\u6b21\u6570  \u589e\u5f3a\u4e86\u53ef\u8bfb\u6027+\u64cd\u4f5c\u7b80\u5355\n\u521b\u5efa\u65b9\u5f0f: Multiset&lt;String&gt; set = HashMultiset.create();\n\nMultimap: key-value  key\u53ef\u4ee5\u91cd\u590d  \n\u521b\u5efa\u65b9\u5f0f: Multimap&lt;String, String&gt; teachers = ArrayListMultimap.create();\n\nBiMap: \u53cc\u5411Map(Bidirectional Map) \u952e\u4e0e\u503c\u90fd\u4e0d\u80fd\u91cd\u590d\n\u521b\u5efa\u65b9\u5f0f:  BiMap&lt;String, String&gt; biMap = HashBiMap.create();\n\nTable: \u53cc\u952e\u7684Map Map--&gt;Table--&gt;rowKey+columnKey+value  \/\/\u548csql\u4e2d\u7684\u8054\u5408\u4e3b\u952e\u6709\u70b9\u50cf\n\u521b\u5efa\u65b9\u5f0f: Table&lt;String, String, Integer&gt; tables = HashBasedTable.create();\n\n...\u7b49\u7b49(guava\u4e2d\u8fd8\u6709\u5f88\u591ajava\u91cc\u9762\u6ca1\u6709\u7ed9\u51fa\u7684\u96c6\u5408\u7c7b\u578b)<\/code><\/pre>\n<h3>\u5c06\u96c6\u5408\u8f6c\u6362\u4e3a\u7279\u5b9a\u89c4\u5219\u7684\u5b57\u7b26\u4e32<\/h3>\n<p>\u4ee5\u524d\u6211\u4eec\u5c06list\u8f6c\u6362\u4e3a\u7279\u5b9a\u89c4\u5219\u7684\u5b57\u7b26\u4e32\u662f\u8fd9\u6837\u5199\u7684:<\/p>\n<pre><code class=\"language-java\">\/\/use java\nList&lt;String&gt; list = new ArrayList&lt;String&gt;();\nlist.add(&quot;aa&quot;);\nlist.add(&quot;bb&quot;);\nlist.add(&quot;cc&quot;);\nString str = &quot;&quot;;\nfor(int i=0; i&lt;list.size(); i++){\n    str = str + &quot;-&quot; +list.get(i);\n}\n\/\/str \u4e3a-aa-bb-cc\n\n\/\/use guava\nList&lt;String&gt; list = new ArrayList&lt;String&gt;();\nlist.add(&quot;aa&quot;);\nlist.add(&quot;bb&quot;);\nlist.add(&quot;cc&quot;);\nString result = Joiner.on(&quot;-&quot;).join(list);\n\/\/result\u4e3a aa-bb-cc<\/code><\/pre>\n<p>\u628amap\u96c6\u5408\u8f6c\u6362\u4e3a\u7279\u5b9a\u89c4\u5219\u7684\u5b57\u7b26\u4e32<\/p>\n<pre><code class=\"language-java\">Map&lt;String, Integer&gt; map = Maps.newHashMap();\nmap.put(&quot;xiaoming&quot;, 12);\nmap.put(&quot;xiaohong&quot;, 13);\nString result = Joiner.on(&quot;,&quot;).withKeyValueSeparator(&quot;=&quot;).join(map);\n\/\/ result\u4e3a xiaoming=12,xiaohong=13<\/code><\/pre>\n<h3>\u5c06String\u8f6c\u6362\u4e3a\u7279\u5b9a\u7684\u96c6\u5408<\/h3>\n<pre><code class=\"language-java\">\/\/use java\nList&lt;String&gt; list = new ArrayList&lt;String&gt;();\nString a = &quot;1-2-3-4-5-6&quot;;\nString[] strs = a.split(&quot;-&quot;);\nfor (int i=0; i&lt;strs.length; i++) {\n    list.add(strs[i]);\n}\n\n\/\/use guava\nString str = &quot;1-2-3-4-5-6&quot;;\nList&lt;String&gt; list = Splitter.on(&quot;-&quot;).splitToList(str);\n\/\/list\u4e3a [1, 2, 3, 4, 5, 6]<\/code><\/pre>\n<p>\u5982\u679c<\/p>\n<pre><code class=\"language-java\">str=&quot;1-2-3-4- 5-  6  &quot;;<\/code><\/pre>\n<p>guava\u8fd8\u53ef\u4ee5\u4f7f\u7528<code>omitEmptyStrings().trimResults()<\/code>\u53bb\u9664\u7a7a\u4e32\u4e0e\u7a7a\u683c<\/p>\n<pre><code class=\"language-java\">String str = &quot;1-2-3-4-  5-  6   &quot;;  \nList&lt;String&gt; list = Splitter.on(&quot;-&quot;).omitEmptyStrings().trimResults().splitToList(str);\nSystem.out.println(list);<\/code><\/pre>\n<p>\u5c06String\u8f6c\u6362\u4e3amap<\/p>\n<pre><code class=\"language-java\">String str = &quot;xiaoming=11,xiaohong=23&quot;;\nMap&lt;String,String&gt; map = Splitter.on(&quot;,&quot;).withKeyValueSeparator(&quot;=&quot;).split(str);<\/code><\/pre>\n<p>guava\u8fd8\u652f\u6301\u591a\u4e2a\u5b57\u7b26\u5207\u5272\uff0c\u6216\u8005\u7279\u5b9a\u7684\u6b63\u5219\u5206\u9694<\/p>\n<pre><code class=\"language-java\">String input = &quot;aa.dd,,ff,,.&quot;;\nList&lt;String&gt; result = Splitter.onPattern(&quot;[.|,]&quot;).omitEmptyStrings().splitToList(input);<\/code><\/pre>\n<h3>\u5b57\u7b26\u4e32\u5339\u914d\u64cd\u4f5c<\/h3>\n<p>\u5173\u4e8e\u5b57\u7b26\u4e32\u7684\u5339\u914d\u64cd\u4f5c\uff0c\u90fd\u662f\u5728CharMatcher\u8fd9\u4e2a\u7c7b\u4e0a\u8fdb\u884c\u7684<\/p>\n<pre><code class=\"language-java\">\/\/ \u5224\u65ad\u5339\u914d\u7ed3\u679c\nboolean result = CharMatcher.inRange(&#039;a&#039;, &#039;z&#039;).or(CharMatcher.inRange(&#039;A&#039;, &#039;Z&#039;)).matches(&#039;K&#039;); \/\/true\n\n\/\/ \u4fdd\u7559\u6570\u5b57\u6587\u672c  CharMatcher.digit() \u5df2\u8fc7\u65f6   retain \u4fdd\u7559\n\/\/String s1 = CharMatcher.digit().retainFrom(&quot;abc 123 efg&quot;); \/\/123\nString s1 = CharMatcher.inRange(&#039;0&#039;, &#039;9&#039;).retainFrom(&quot;abc 123 efg&quot;); \/\/ 123\n\n\/\/ \u5220\u9664\u6570\u5b57\u6587\u672c  remove \u5220\u9664\n\/\/ String s2 = CharMatcher.digit().removeFrom(&quot;abc 123 efg&quot;);    \/\/abc  efg\nString s2 = CharMatcher.inRange(&#039;0&#039;, &#039;9&#039;).removeFrom(&quot;abc 123 efg&quot;); \/\/ abc  efg<\/code><\/pre>\n<h3>\u96c6\u5408\u7684\u8fc7\u6ee4<\/h3>\n<p>\u6211\u4eec\u5bf9\u4e8e\u96c6\u5408\u7684\u8fc7\u6ee4\uff0c\u601d\u8def\u5c31\u662f\u8fed\u4ee3\uff0c\u7136\u540e\u518d\u5177\u4f53\u5bf9\u6bcf\u4e00\u4e2a\u6570\u5224\u65ad\uff0c\u8fd9\u6837\u7684\u4ee3\u7801\u653e\u5728\u7a0b\u5e8f\u4e2d\uff0c\u96be\u514d\u4f1a\u663e\u5f97\u5f88\u81c3\u80bf\uff0c\u867d\u7136\u529f\u80fd\u90fd\u6709\uff0c\u4f46\u662f\u5f88\u4e0d\u597d\u770b\u3002<\/p>\n<pre><code class=\"language-java\">\/\/guava\u5199\u6cd5\n\/\/\u6309\u7167\u6761\u4ef6\u8fc7\u6ee4\nImmutableList&lt;String&gt; names = ImmutableList.of(&quot;begin&quot;, &quot;code&quot;, &quot;Guava&quot;, &quot;Java&quot;);\nIterable&lt;String&gt; fitered = Iterables.filter(names, Predicates.or(Predicates.equalTo(&quot;Guava&quot;), Predicates.equalTo(&quot;Java&quot;)));\nSystem.out.println(fitered); \/\/ [Guava, Java]\n\n\/\/\u81ea\u5b9a\u4e49\u8fc7\u6ee4\u6761\u4ef6   \u4f7f\u7528\u81ea\u5b9a\u4e49\u56de\u8c03\u65b9\u6cd5\u5bf9Map\u7684\u6bcf\u4e2aValue\u8fdb\u884c\u64cd\u4f5c\nImmutableMap&lt;String, Integer&gt; m = ImmutableMap.of(&quot;begin&quot;, 12, &quot;code&quot;, 15);\n\/\/ Function&lt;F, T&gt; F\u8868\u793aapply()\u65b9\u6cd5input\u7684\u7c7b\u578b\uff0cT\u8868\u793aapply()\u65b9\u6cd5\u8fd4\u56de\u7c7b\u578b\nMap&lt;String, Integer&gt; m2 = Maps.transformValues(m, new Function&lt;Integer, Integer&gt;() {\n    public Integer apply(Integer input) {\n        if (input &gt; 12 ){\n            return input;\n        } else {\n            return input+1;\n        }\n    }\n});\nSystem.out.println(m2);   \/\/{begin=13, code=15}<\/code><\/pre>\n<p>set\u7684\u4ea4\u96c6, \u5e76\u96c6, \u5dee\u96c6<\/p>\n<pre><code class=\"language-java\">HashSet&lt;Integer&gt; setA = Sets.newHashSet(1, 2, 3, 4, 5);\nHashSet&lt;Integer&gt; setB = Sets.newHashSet(4, 5, 6, 7, 8);\n\nSets.SetView&lt;Integer&gt; union = Sets.union(setA, setB);\nSystem.out.println(&quot;union:&quot;);\nfor (Integer integer : union)\n    System.out.println(integer);    \/\/union \u5e76\u96c6: 12345867\n\nSets.SetView&lt;Integer&gt; difference = Sets.difference(setA, setB);\nSystem.out.println(&quot;difference:&quot;);\nfor (Integer integer : difference)\n    System.out.println(integer);    \/\/difference \u5dee\u96c6: 123\n\nSets.SetView&lt;Integer&gt; intersection = Sets.intersection(setA, setB);\nSystem.out.println(&quot;intersection:&quot;);\nfor (Integer integer : intersection)\n    System.out.println(integer);    \/\/intersection \u4ea4\u96c6: 45<\/code><\/pre>\n<p>map\u7684\u4ea4\u96c6\uff0c\u5e76\u96c6\uff0c\u5dee\u96c6<\/p>\n<pre><code class=\"language-java\">HashMap&lt;String, Integer&gt; mapA = Maps.newHashMap();\nmapA.put(&quot;a&quot;, 1);mapA.put(&quot;b&quot;, 2);mapA.put(&quot;c&quot;, 3);\n\nHashMap&lt;String, Integer&gt; mapB = Maps.newHashMap();\nmapB.put(&quot;b&quot;, 20);mapB.put(&quot;c&quot;, 3);mapB.put(&quot;d&quot;, 4);\n\nMapDifference differenceMap = Maps.difference(mapA, mapB);\nSystem.out.println(differenceMap);  \/\/not equal: only on left={a=1}: only on right={d=4}: value differences={b=(2, 20)}\ndifferenceMap.areEqual();\nMap entriesDiffering = differenceMap.entriesDiffering();\nMap entriesOnlyLeft = differenceMap.entriesOnlyOnLeft();\nMap entriesOnlyRight = differenceMap.entriesOnlyOnRight();\nMap entriesInCommon = differenceMap.entriesInCommon();\n\nSystem.out.println(entriesDiffering);   \/\/ {b=(2, 20)}\nSystem.out.println(entriesOnlyLeft);    \/\/ {a=1}\nSystem.out.println(entriesOnlyRight);   \/\/ {d=4}\nSystem.out.println(entriesInCommon);    \/\/ {c=3}<\/code><\/pre>\n<h3>\u68c0\u67e5\u53c2\u6570<\/h3>\n<pre><code class=\"language-java\">\/\/use java\nif (list!=null &amp;&amp; list.size()&gt;0)\n&#039;&#039;&#039;\nif (str!=null &amp;&amp; str.length()&gt;0)\n&#039;&#039;&#039;\nif (str !=null &amp;&amp; !str.isEmpty())\n\n\/\/use guava\nif (!Strings.isNullOrEmpty(str))\n\n\/\/use java\nif (count &lt;= 0) {\n    throw new IllegalArgumentException(&quot;must be positive: &quot; + count);         \n}    \n\n\/\/use guava\nPreconditions.checkArgument(count &gt; 0, &quot;must be positive: %s&quot;, count);  <\/code><\/pre>\n<p>\u68c0\u67e5\u662f\u5426\u4e3a\u7a7a\uff0c\u4e0d\u4ec5\u4ec5\u662f\u5b57\u7b26\u4e32\u7c7b\u578b\uff0c\u5176\u4ed6\u7c7b\u578b\u7684\u5224\u65ad\uff0c\u5168\u90e8\u90fd\u5c01\u88c5\u5728<code>Preconditions<\/code>\u7c7b\u91cc\uff0c\u91cc\u9762\u7684\u65b9\u6cd5\u5168\u4e3a\u9759\u6001<\/p>\n<p>\u5176\u4e2d\u7684\u4e00\u4e2a\u65b9\u6cd5\u7684\u6e90\u7801<\/p>\n<pre><code class=\"language-java\">@CanIgnoreReturnValue\npublic static &lt;T&gt; T checkNotNull(T reference) {\n    if (reference == null) {\n      throw new NullPointerException();\n    }\n    return reference;\n}<\/code><\/pre>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">\u65b9\u6cd5\u58f0\u660e\uff08\u4e0d\u5305\u62ec\u989d\u5916\u53c2\u6570\uff09<\/th>\n<th style=\"text-align: left;\">\u63cf\u8ff0<\/th>\n<th style=\"text-align: left;\">\u68c0\u67e5\u5931\u8d25\u65f6\u629b\u51fa\u7684\u5f02\u5e38<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>checkArgument(boolean)<\/code><\/td>\n<td style=\"text-align: left;\">\u68c0\u67e5boolean\u662f\u5426\u4e3atrue\uff0c\u7528\u6765\u68c0\u67e5\u4f20\u9012\u7ed9\u65b9\u6cd5\u7684\u53c2\u6570<\/td>\n<td style=\"text-align: left;\"><code>IllegalArgumentException<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>checkNotNull(T)<\/code><\/td>\n<td style=\"text-align: left;\">\u68c0\u67e5value\u662f\u5426\u4e3anull\uff0c\u8be5\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56devalue\uff0c\u56e0\u6b64\u53ef\u4ee5\u5185\u5d4c\u4f7f\u7528checkNotNull<\/td>\n<td style=\"text-align: left;\"><code>NullPointerException<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>checkState(boolean)<\/code><\/td>\n<td style=\"text-align: left;\">\u7528\u6765\u68c0\u67e5\u5bf9\u8c61\u7684\u67d0\u4e9b\u72b6\u6001<\/td>\n<td style=\"text-align: left;\"><code>IllegalStateException<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>checkElementIndex(int index, int size)<\/code><\/td>\n<td style=\"text-align: left;\">\u68c0\u67e5index\u4f5c\u4e3a\u7d22\u5f15\u503c\u5bf9\u67d0\u4e2a\u5217\u8868\u3001\u5b57\u7b26\u4e32\u6216\u6570\u7ec4\u662f\u5426\u6709\u6548\u3002<br \/><code>index &gt; 0 &amp;&amp; index &lt; size<\/code><\/td>\n<td style=\"text-align: left;\"><code>IndexOutOfBoundsException<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>checkPositionIndexes(int start, int end, int size)<\/code><\/td>\n<td style=\"text-align: left;\">\u68c0\u67e5[start,end]\u8868\u793a\u7684\u4f4d\u7f6e\u8303\u56f4\u5bf9\u67d0\u4e2a\u5217\u8868\u3001\u5b57\u7b26\u4e32\u6216\u6570\u7ec4\u662f\u5426\u6709\u6548<\/td>\n<td style=\"text-align: left;\"><code>IndexOutOfBoundsException<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>MoreObjects<\/h3>\n<p>\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5728Objects\u8fc7\u671f\u540e\u5b98\u65b9\u63a8\u8350\u4f7f\u7528\u7684\u66ff\u4ee3\u54c1\uff0c\u8be5\u7c7b\u6700\u5927\u7684\u597d\u5904\u5c31\u662f\u4e0d\u7528\u5927\u91cf\u7684\u91cd\u5199<code>toString<\/code>\uff0c\u7528\u4e00\u79cd\u5f88\u4f18\u96c5\u7684\u65b9\u5f0f\u5b9e\u73b0\u91cd\u5199\uff0c\u6216\u8005\u5728\u67d0\u4e2a\u573a\u666f\u5b9a\u5236\u4f7f\u7528\u3002<\/p>\n<pre><code class=\"language-java\">Person person = new Person(&quot;aa&quot;, 11);\nString str = MoreObjects.toStringHelper(&quot;Person&quot;).add(&quot;age&quot;, person.getAge()).toString();\nSystem.out.println(str);  \n\/\/\u8f93\u51faPerson{age=11}<\/code><\/pre>\n<h3>\u5f3a\u5927\u7684Ordering\u6392\u5e8f\u5668<\/h3>\n<p>\u6392\u5e8f\u5668[Ordering]\u662fGuava\u6d41\u7545\u98ce\u683c\u6bd4\u8f83\u5668[Comparator]\u7684\u5b9e\u73b0\uff0c\u5b83\u53ef\u4ee5\u7528\u6765\u4e3a\u6784\u5efa\u590d\u6742\u7684\u6bd4\u8f83\u5668\uff0c\u4ee5\u5b8c\u6210\u96c6\u5408\u6392\u5e8f\u7684\u529f\u80fd\u3002<\/p>\n<pre><code class=\"language-java\">natural()  \u5bf9\u53ef\u6392\u5e8f\u7c7b\u578b\u505a\u81ea\u7136\u6392\u5e8f\uff0c\u5982\u6570\u5b57\u6309\u5927\u5c0f\uff0c\u65e5\u671f\u6309\u5148\u540e\u6392\u5e8f\nusingToString()  \u6309\u5bf9\u8c61\u7684\u5b57\u7b26\u4e32\u5f62\u5f0f\u505a\u5b57\u5178\u6392\u5e8f[lexicographical ordering]\nfrom(Comparator)  \u628a\u7ed9\u5b9a\u7684Comparator\u8f6c\u5316\u4e3a\u6392\u5e8f\u5668\nreverse()  \u83b7\u53d6\u8bed\u4e49\u76f8\u53cd\u7684\u6392\u5e8f\u5668\nnullsFirst()  \u4f7f\u7528\u5f53\u524d\u6392\u5e8f\u5668\uff0c\u4f46\u989d\u5916\u628anull\u503c\u6392\u5230\u6700\u524d\u9762\nnullsLast()  \u4f7f\u7528\u5f53\u524d\u6392\u5e8f\u5668\uff0c\u4f46\u989d\u5916\u628anull\u503c\u6392\u5230\u6700\u540e\u9762\ncompound(Comparator)  \u5408\u6210\u53e6\u4e00\u4e2a\u6bd4\u8f83\u5668\uff0c\u4ee5\u5904\u7406\u5f53\u524d\u6392\u5e8f\u5668\u4e2d\u7684\u76f8\u7b49\u60c5\u51b5\nlexicographical()  \u57fa\u4e8e\u5904\u7406\u7c7b\u578bT\u7684\u6392\u5e8f\u5668\uff0c\u8fd4\u56de\u8be5\u7c7b\u578b\u7684\u53ef\u8fed\u4ee3\u5bf9\u8c61Iterable&lt;T&gt;\u7684\u6392\u5e8f\u5668\nonResultOf(Function)  \u5bf9\u96c6\u5408\u4e2d\u5143\u7d20\u8c03\u7528Function\uff0c\u518d\u6309\u8fd4\u56de\u503c\u7528\u5f53\u524d\u6392\u5e8f\u5668\u6392\u5e8f<\/code><\/pre>\n<p>\u793a\u4f8b<\/p>\n<pre><code class=\"language-java\">Person person = new Person(&quot;aa&quot;, 14);  \/\/String name, Integer age\nPerson ps = new Person(&quot;bb&quot;, 13);\nOrdering&lt;Person&gt; byOrdering = Ordering.natural().nullsFirst().onResultOf(new Function&lt;Person, String&gt;() {\n    public String apply(Person person) {\n        return person.age.toString();\n    }\n});\nbyOrdering.compare(person, ps);\nSystem.out.println(byOrdering.compare(person, ps)); \/\/1\uff0cperson\u7684\u5e74\u9f84\u6bd4ps\u5927\uff0c\u6240\u4ee5\u8f93\u51fa1<\/code><\/pre>\n<h3>\u8ba1\u7b97\u4e2d\u95f4\u4ee3\u7801\u7684\u8fd0\u884c\u65f6\u95f4<\/h3>\n<pre><code class=\"language-java\">Stopwatch stopwatch = Stopwatch.createStarted();\nfor (int i=0; i&lt;100000; i++) {\n    \/\/ do some thing\n}\nlong nanos = stopwatch.elapsed(TimeUnit.MILLISECONDS);\nSystem.out.println(nanos);<\/code><\/pre>\n<p>TimeUnit \u53ef\u4ee5\u6307\u5b9a\u65f6\u95f4\u8f93\u51fa\u7cbe\u786e\u5230\u591a\u5c11\u65f6\u95f4<\/p>\n<h3>\u6587\u4ef6\u64cd\u4f5c<\/h3>\n<p>\u4ee5\u524d\u6211\u4eec\u5199\u6587\u4ef6\u8bfb\u53d6\u7684\u65f6\u5019\u8981\u5b9a\u4e49\u7f13\u51b2\u533a\uff0c\u5404\u79cd\u6761\u4ef6\u5224\u65ad\uff0c\u800c\u73b0\u5728\u6211\u4eec\u53ea\u9700\u8981\u4f7f\u7528\u597dguava\u7684api \u5c31\u80fd\u4f7f\u4ee3\u7801\u53d8\u5f97\u7b80\u6d01\uff0c\u5e76\u4e14\u4e0d\u7528\u62c5\u5fc3\u56e0\u4e3a\u5199\u9519\u903b\u8f91\u800c\u80cc\u9505\u4e86<\/p>\n<pre><code class=\"language-java\">File file = new File(&quot;test.txt&quot;);\nList&lt;String&gt; list = null;\ntry {\n    list = Files.readLines(file, Charsets.UTF_8);\n} catch (Exception e) {\n}\n\nFiles.copy(from, to);  \/\/\u590d\u5236\u6587\u4ef6\nFiles.deleteDirectoryContents(File directory);  \/\/\u5220\u9664\u6587\u4ef6\u5939\u4e0b\u7684\u5185\u5bb9(\u5305\u62ec\u6587\u4ef6\u4e0e\u5b50\u6587\u4ef6\u5939)  \nFiles.deleteRecursively(File file);  \/\/\u5220\u9664\u6587\u4ef6\u6216\u8005\u6587\u4ef6\u5939  \nFiles.move(File from, File to);  \/\/\u79fb\u52a8\u6587\u4ef6\nURL url = Resources.getResource(&quot;abc.xml&quot;);  \/\/\u83b7\u53d6classpath\u6839\u4e0b\u7684abc.xml\u6587\u4ef6url\n\n\/\/\u6216\u8005\u4f7f\u7528\u5982\u4e0b\u7684\u64cd\u4f5c\nFiles.copy(from, to);  \/\/\u590d\u5236\u6587\u4ef6\nPath path = Paths.get(&quot;\/home\/yezhou\/spring-boot-starter-hello\/src\/main\/resources\/config&quot;);\n\nMoreFiles.deleteDirectoryContents(path, RecursiveDeleteOption.ALLOW_INSECURE); \/\/\u5220\u9664\u6587\u4ef6\u5939\u4e0b\u7684\u5185\u5bb9(\u5305\u62ec\u6587\u4ef6\u4e0e\u5b50\u6587\u4ef6\u5939)\nMoreFiles.deleteRecursively(File file);  \/\/\u5220\u9664\u6587\u4ef6\u6216\u8005\u6587\u4ef6\u5939\nMoreFiles.createParentDirectories(path);  \/\/\u521b\u5efa\u7236\u76ee\u5f55<\/code><\/pre>\n<p>Files\u7c7b\u4e2d\u8fd8\u6709\u8bb8\u591a\u65b9\u6cd5\u53ef\u4ee5\u7528\uff0c\u53ef\u4ee5\u591a\u591a\u7ffb\u9605<\/p>\n<h3>guava\u7f13\u5b58<\/h3>\n<p>guava\u7684\u7f13\u5b58\u8bbe\u8ba1\u7684\u6bd4\u8f83\u5de7\u5999\uff0c\u53ef\u4ee5\u5f88\u7cbe\u5de7\u7684\u4f7f\u7528\u3002guava\u7f13\u5b58\u521b\u5efa\u5206\u4e3a\u4e24\u79cd\uff0c\u4e00\u79cd\u662fCacheLoader\uff0c\u53e6\u4e00\u79cd\u5219\u662fcallback\u65b9\u5f0f<\/p>\n<p>\uff081\uff09CacheLoader\u65b9\u5f0f<\/p>\n<pre><code class=\"language-java\">LoadingCache&lt;String, String&gt; cahceBuilder = CacheBuilder\n    .newBuilder()\n    .build(new CacheLoader&lt;String, String&gt;() {\n        @Override\n        public String load(String key) throws Exception {\n            String strProValue = &quot;hello &quot; + key + &quot;!&quot;;\n            return strProValue;\n        }\n    });\nSystem.out.println(cahceBuilder.apply(&quot;begincode&quot;));  \/\/hello begincode!\nSystem.out.println(cahceBuilder.get(&quot;begincode&quot;));  \/\/hello begincode!\nSystem.out.println(cahceBuilder.get(&quot;wen&quot;));  \/\/hello wen!\nSystem.out.println(cahceBuilder.apply(&quot;wen&quot;));  \/\/hello wen!\nSystem.out.println(cahceBuilder.apply(&quot;da&quot;));  \/\/hello da!\ncahceBuilder.put(&quot;begin&quot;, &quot;code&quot;);\nSystem.out.println(cahceBuilder.get(&quot;begin&quot;));  \/\/code<\/code><\/pre>\n<p>api\u4e2d\u5df2\u7ecf\u628aapply\u58f0\u660e\u4e3a\u8fc7\u671f\uff0c\u58f0\u660e\u4e2d\u63a8\u8350\u4f7f\u7528get\u65b9\u6cd5\u83b7\u53d6\u503c<\/p>\n<p>\uff082\uff09callback\u65b9\u5f0f<\/p>\n<pre><code class=\"language-java\">Cache&lt;String, String&gt; cache = CacheBuilder.newBuilder().maximumSize(1000).build();\nString resultVal = cache.get(&quot;code&quot;, new Callable&lt;String&gt;() {\n    public String call() {\n        String strProValue = &quot;begin &quot; + &quot;code&quot; + &quot;!&quot;;\n        return strProValue;\n    }\n});\nSystem.out.println(&quot;value : &quot; + resultVal);  \/\/value : begin code!<\/code><\/pre>\n<p>\u4ee5\u4e0a\u53ea\u662fguava\u4f7f\u7528\u7684\u4e00\u5c0f\u90e8\u5206\uff0cguava\u662f\u4e2a\u5927\u7684\u5de5\u5177\u7c7b\uff0c\u7b2c\u4e00\u7248guava\u662f2010\u5e74\u53d1\u5e03\u7684\uff0c\u6bcf\u4e00\u7248\u7684\u66f4\u65b0\u548c\u8fed\u4ee3\u90fd\u662f\u4e00\u79cd\u521b\u65b0\u3002<\/p>\n<p>JDK\u7684\u5347\u7ea7\u5f88\u591a\u90fd\u662f\u501f\u9274guava\u91cc\u9762\u7684\u601d\u60f3\u6765\u8fdb\u884c\u7684\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6982\u8ff0 \u5de5\u5177\u7c7b\uff0c\u5c31\u662f\u5c01\u88c5\u5e73\u5e38\u7528\u7684\u65b9\u6cd5\uff0c\u4e0d\u9700\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u8282\u7701\u5f00\u53d1\u4eba\u5458\u65f6\u95f4\uff0c\u63d0\u9ad8\u5de5\u4f5c\u6548\u7387\u3002\u8c37\u6b4c\u4f5c\u4e3a\u5927\u516c\u53f8\uff0c\u5f53\u7136\u4f1a\u4ece [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[113],"class_list":["post-681","post","type-post","status-publish","format-standard","hentry","category-java","tag-guava"],"_links":{"self":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/681","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/comments?post=681"}],"version-history":[{"count":0,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/681\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/media?parent=681"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/categories?post=681"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/tags?post=681"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}