Guava 3:コレクションCollections

35318 ワード

一、リード
GuavaのJDK集合への広がりは、最も成熟し、最も人気のある部分です.本文はGuavaの核心に属し、よく見る必要がある.
二、Guava集合
2.1 Immutable Collections不変集合
1.作用
不変の集合で防御的なプログラミングとパフォーマンスの向上を行います.
2.簡単に使う
 1 package guava.collect;
 2 
 3 import com.google.common.collect.ImmutableSet;
 4 
 5 /**
 6  * @author denny
 7  * @Description      
 8  * @date 2018/7/26   3:16
 9  */
10 public class ImmutableCollectionsTest {
11     /**
12      * 1.        
13      */
14     public static final ImmutableSet COLOR_NAMES_1 = ImmutableSet.of(
15         "red",
16         "orange",
17         "yellow",
18         "green");
19     /**
20      * 2.   copy
21      */
22     public static final ImmutableSet COLOR_NAMES_2 = ImmutableSet.copyOf(COLOR_NAMES_1);
23 
24     /**
25      * 3.builder     
26      */
27     public static final ImmutableSet COLOR_NAMES_3 = ImmutableSet.builder().addAll(COLOR_NAMES_2).add("blue").build();
28 
29 
30     public static void main(String[] args) {
31         System.out.println("of:"+COLOR_NAMES_1);
32         System.out.println("   copy:"+COLOR_NAMES_2);
33         System.out.println("     :"+COLOR_NAMES_3);
34         System.out.println("   list:"+COLOR_NAMES_3.asList());
35     }
36 }

印刷:
of:[red, orange, yellow, green]
   copy:[red, orange, yellow, green]
     :[red, orange, yellow, green, blue]
   list:[red, orange, yellow, green, blue]

2.2新しい集合タイプ
1.作用
Multisets、multimaps、tables、bidirectional mapsなど、さまざまな使用シーンに便利です.
2.簡単に使う
多くのクラスでは、multiset、multimapインタフェースのみを分析し、他のクラスはテストクラスで体現されています.
Multisetインタフェース
JDK:java.util.Colectionインタフェースから継承され、同じ要素を複数回追加することをサポートし、無秩序です.
Multisetを通常のCollectionと見なすと、無秩序なArrayListのように表現されます.
  • add(E)単一与えられた要素
  • を追加
  • iterator()は、Multisetのすべての要素(重複する要素を含む)を含む
  • を含む反復器を返します.
  • size()は、すべての要素の合計数(重複する要素を含む)
  • を返します.
    MultisetをMapと見なすと、パフォーマンスに適したクエリー操作も提供されます.
  • count(Object)は、与えられた要素のカウントを返します.HashMultiset.contの複雑度はO(1)であり,TreeMultiset.contの複雑度はO(log n)であった.
  • entrySet()は、MapのentrySetと同様に、Set>を返します.
  • elementSet()は、MapのkeySet()と同様に、重複しないすべての要素のSetを返します.
  • すべてのMultisetによって実現されるメモリ消費量は、重複しない要素の個数とともに線形に増加する. 

  • Multimapインタフェース
  • は、1つのkeyマッピングの複数のvalue:k 1−v 1,k 1−v 2をサポートする.
  • はasMap()ビューを提供し、Map>、すなわちk 1->v集合(v 1,v 2)
  • を返す.
    様々なmultimap実装クラスは以下の通りである.
    テストクラスは次のとおりです.
     1 package guava.collect;
     2 
     3 import com.google.common.collect.BiMap;
     4 import com.google.common.collect.ClassToInstanceMap;
     5 import com.google.common.collect.HashBasedTable;
     6 import com.google.common.collect.HashBiMap;
     7 import com.google.common.collect.HashMultimap;
     8 import com.google.common.collect.HashMultiset;
     9 import com.google.common.collect.Lists;
    10 import com.google.common.collect.Multimap;
    11 import com.google.common.collect.Multiset;
    12 import com.google.common.collect.MutableClassToInstanceMap;
    13 import com.google.common.collect.Range;
    14 import com.google.common.collect.RangeMap;
    15 import com.google.common.collect.RangeSet;
    16 import com.google.common.collect.Table;
    17 import com.google.common.collect.TreeRangeMap;
    18 import com.google.common.collect.TreeRangeSet;
    19 
    20 /**
    21  * @author denny
    22  * @Description        
    23  * @date 2018/7/26   6:29
    24  */
    25 public class MultiCollectionsTest {
    26     public static void main(String[] args) {
    27 
    28         System.out.println("====1.Multiset=======");
    29         /** 1.Multiset             */
    30         Multiset wordsMultiset = HashMultiset.create();
    31         //     
    32         wordsMultiset.addAll(Lists.newArrayList("a", "b", "c", "a", "b", "a"));
    33         //
    34         wordsMultiset.elementSet().forEach(e -> System.out.println(e + ":" + wordsMultiset.count(e)));
    35 
    36         System.out.println("====2.Multimap=======");
    37         /** 2.Multimap 1 key value   */
    38         Multimap multimap = HashMultimap.create();
    39         multimap.put("a", 1);
    40         multimap.put("b", 2);
    41         multimap.put("c", 3);
    42         multimap.put("a", 4);
    43         System.out.println(" -     :");
    44         //  -     :asMap()  map(key,Collection),   map    ,  
    45         multimap.asMap().entrySet().forEach(e -> System.out.println(e.getKey() + ":" + e.getValue()));
    46         System.out.println(" -     :");
    47         //  -     :     
    48         multimap.entries().forEach(e -> System.out.println(e.getKey() + ":" + e.getValue()));
    49 
    50         System.out.println("====3.BiMap=======");
    51         /** 3.BiMap      */
    52         BiMap biMap = HashBiMap.create();
    53         biMap.put("a", 1);
    54         biMap.put("b", 2);
    55         System.out.println("   " + biMap);
    56         System.out.println("    :" + biMap.inverse());
    57 
    58         System.out.println("====4.Table=======");
    59         /** 4.Table  */
    60         Table table = HashBasedTable.create();
    61         table.put("a", "b", 1);
    62         table.put("a", "c", 2);
    63         table.put("d", "b", 3);
    64         System.out.println(table);
    65         System.out.println("row a=" + table.row("a"));
    66         System.out.println("column b=" + table.column("b"));
    67 
    68         /** 5.ClassToInstanceMap  、     */
    69         System.out.println("====5.ClassToInstanceMap=======");
    70         ClassToInstanceMap classToInstanceMap = MutableClassToInstanceMap.create();
    71         classToInstanceMap.putInstance(Integer.class, 1);
    72         classToInstanceMap.putInstance(Double.class, 2D);
    73         classToInstanceMap.putInstance(Long.class, 3L);
    74         System.out.println(classToInstanceMap);
    75 
    76         /** 6. RangeSet     ; RangeMap     */
    77         System.out.println("====6.RangeSet、RangeMap=======");
    78         RangeSet rangeSet = TreeRangeSet.create();
    79         // [1,10]
    80         rangeSet.add(Range.closed(1,10));
    81         //        [1,10] [11,15)
    82         rangeSet.add(Range.closedOpen(11,15));
    83         //     [11,15)+[15,20)=[11,20),    :[1,10] [11,20)
    84         rangeSet.add(Range.closedOpen(15,20));
    85         // [1,10]-(5,10)=[1,5][10,10] ,    :[1,5][10,10][11,20]
    86         rangeSet.remove(Range.open(5,10));
    87         System.out.println("rangeSet="+rangeSet);
    88         RangeMap rangeMap = TreeRangeMap.create();
    89         rangeMap.put(Range.closed(1,10),"  1");
    90         //      key     ,      
    91         rangeMap.put(Range.closed(5,20),"  2");
    92         System.out.println("rangeMap="+rangeMap);
    93     }
    94 }

    印刷ログは次のとおりです.
     1 ====1.Multiset=======
     2 a:3
     3 b:2
     4 c:1
     5 ====2.Multimap=======
     6  - 7 a:[4, 1]
     8 b:[2]
     9 c:[3]
    10  -11 a:4
    12 a:1
    13 b:2
    14 c:3
    15 ====3.BiMap=======
    16    {a=1, b=2}
    17     :{1=a, 2=b}
    18 ====4.Table=======
    19 {a={b=1, c=2}, d={b=3}}
    20 row a={b=1, c=2}
    21 column b={a=1, d=3}
    22 ====5.ClassToInstanceMap=======
    23 {class java.lang.Integer=1, class java.lang.Double=2.0, class java.lang.Long=3}
    24 ====6.RangeSet、RangeMap=======
    25 rangeSet=[[1..5], [10..10], [11..20)]
    26 rangeMap=[[1..5)=  1, [5..20]=  2]

    2.3強力な集合ツールクラス
    1.作用
    Java.util.Collectionsにないコレクションツールの提供
    2.簡単に使う
    集合インタフェース、所属関係、Guava対応ツールマッピング関係は次の表のとおりです.
     1 package guava.collect;
     2 
     3 import com.google.common.base.Function;
     4 import com.google.common.collect.ImmutableMap;
     5 import com.google.common.collect.ImmutableSet;
     6 import com.google.common.collect.Iterables;
     7 import com.google.common.collect.Lists;
     8 import com.google.common.collect.MapDifference;
     9 import com.google.common.collect.Maps;
    10 import com.google.common.collect.Sets;
    11 import com.google.common.primitives.Ints;
    12 
    13 import java.util.List;
    14 import java.util.Map;
    15 import java.util.Set;
    16 
    17 /**
    18  * @Description 
    19  * @author denny
    20  * @date 2018/7/27   2:46
    21  */
    22 public class UtilityClassesTest {
    23 
    24     public static void main(String[] args) {
    25         /** 1.Iterables        */
    26         System.out.println("=========Iterables=========");
    27         Iterable concate = Iterables.concat(Ints.asList(1,2,3),Ints.asList(2,3,4));
    28         System.out.println("  :"+concate);
    29         System.out.println("  2    :"+Iterables.frequency(concate,2));
    30         System.out.println("          :"+Iterables.partition(concate,2));
    31         System.out.println("      ,      :"+Iterables.getFirst(concate,99));
    32         System.out.println("     :"+Iterables.getLast(concate));
    33 
    34         /** 2.Lists       */
    35         System.out.println("=========Lists=========");
    36         List list = Lists.newArrayList(1,2,3,4,5);
    37         System.out.println("  :"+Lists.reverse(list));
    38         System.out.println("  :"+Lists.partition(list,2));
    39 
    40         /** 3.Sets       */
    41         System.out.println("=========Sets=========");
    42         Set set1 = Sets.newHashSet(1,2,3);
    43         Set set2 = Sets.newHashSet(3,4,5);
    44         System.out.println("  :"+Sets.union(set1,set2));
    45         System.out.println("  :"+Sets.intersection(set1,set2));
    46         System.out.println("  (set1 set2  ):"+Sets.difference(set1,set2));
    47         System.out.println("  -  :"+Sets.symmetricDifference(set1,set2));
    48         System.out.println("    :"+Sets.cartesianProduct(set1,set2));
    49         System.out.println("    :");
    50         Sets.powerSet(set1).forEach(System.out::println);
    51 
    52         /** 4.Maps       */
    53         System.out.println("=========Maps=========");
    54         Map map1 = Maps.newHashMap();
    55         map1.put("a",1);
    56         map1.put("b",2);
    57         map1.put("d",5);
    58         Map map2 = Maps.newHashMap();
    59         map2.put("a",1);
    60         map2.put("b",3);
    61         map2.put("c",4);
    62         MapDifference mapDifference = Maps.difference(map1,map2);
    63         System.out.println("   :"+mapDifference.entriesInCommon());
    64         System.out.println("key  ,value  :"+mapDifference.entriesDiffering());
    65         System.out.println("     :"+mapDifference.entriesOnlyOnLeft());
    66         System.out.println("     :"+mapDifference.entriesOnlyOnRight());
    67         //      
    68         ImmutableSet allColors = ImmutableSet.of("red", "green", "blue");
    69         ImmutableMap immutableMap = Maps.uniqueIndex(allColors, input -> input.length());
    70         System.out.println("         key:"+immutableMap);
    71     }
    72 }

    印刷結果は次のとおりです.
    =========Iterables=========
      :[1, 2, 3, 2, 3, 4]
      2    :2
              :[[1, 2], [3, 2], [3, 4]]
          ,      :14
    =========Lists=========
      :[5, 4, 3, 2, 1]
      :[[1, 2], [3, 4], [5]]
    =========Sets=========
      :[1, 2, 3, 4, 5]
      :[3]
      (set1 set2  ):[1, 2]
      -  :[1, 2, 4, 5]
        :[[1, 3], [1, 4], [1, 5], [2, 3], [2, 4], [2, 5], [3, 3], [3, 4], [3, 5]]
        :
    []
    [1]
    [2]
    [1, 2]
    [3]
    [1, 3]
    [2, 3]
    [1, 2, 3]
    =========Maps=========
       :{a=1}
    key  ,value  :{b=(2, 3)}
         :{d=5}
         :{c=4}
             key{3=red, 5=green, 4=blue}

    2.4拡張ツールクラス
    1.作用
    Collectionのデコレーションを作成したり、反復を実装したりするなど、コレクションクラスの実装と拡張を容易にします.
    2.簡単に使う
    提供しません.guavaの本生はJDKの開拓で、自分で更に開拓して、あなたは更に私をからかいますか...
    三、まとめ
     この文書では、Immutable Collectionsの可変集合、新しい集合タイプ、集合ツールクラス、拡張ツールクラスを含むGuava Collectionパッケージのクラスを簡単に理解し、使用しました.その中の最初の3つは使用をお勧めしますが、最後の拡張ツールクラスはやめましょう.