当前位置:   article > 正文

Google guava工具类中Lists、Maps、Sets简单使用_google lists

google lists

Google guava

Guava是对Java API的补充,对Java开发中常用功能进行更优雅的实现,使得编码更加轻松,代码容易理解。Guava使用了多种设计模式,同时经过了很多测试,得到了越来越多开发团队的青睐。Java最新版本的API采纳了Guava的部分功能,但依旧无法替代。

特点

  • 高效设计良好的API,被Google的开发者设计,实现和使用
  • 遵循高效的java语法实践
  • 使代码更刻度,简洁,简单
  • 节约时间,资源,提高生产力  Guava工程包含了若干被Google的 Java项目广泛依赖的核心库

核心库例如:

  • 集合 [collections]
  • 缓存 [caching]
  • 原生类型支持 [primitives support]
  • 并发库 [concurrency libraries]
  • 通用注解 [common annotations]
  • 字符串处理 [string processing]
  • I/O 等等。

        github地址

https://github.com/google/guavaicon-default.png?t=M0H8https://github.com/google/guava

使用

        依赖引入

  1. <dependencies>
  2. <dependency>
  3. <groupId>com.google.guava</groupId>
  4. <artifactId>guava</artifactId>
  5. <version>28.1-jre</version>
  6. </dependency>
  7. </dependencies>

 Guava 集合工具类

Lists

        官网文档:

Lists (Guava: Google Core Libraries for Java 27.0.1-jre API)icon-default.png?t=M0H8https://guava.dev/releases/27.0.1-jre/api/docs/com/google/common/collect/Lists.html对应于List集合接口, 在com.google.common.collect包下

 Lists 接口的声明如下:

  1. @GwtCompatible(emulated=true)
  2. public final class Lists
  3. extends Object

 Lists 类主要提供了对List类的子类构造以及操作的静态方法。在Lists类中支持构造 ArrayListLinkedList 以及 newCopyOnWriteArrayList 对象的方法。其中提供了以下构造ArrayList的函数:下面四个构造一个 ArrayList 对象,但是不显式的给出申请空间的大小:

  1. newArrayList()
  2. newArrayList(E... elements)
  3. newArrayList(Iterable<? extends E> elements)
  4. newArrayList(Iterator<? extends E> elements)

 测试

  1. ArrayList<Object> objects = Lists.newArrayList();
  2. objects.add("张三");
  3. objects.add(20);
  4. System.out.println("--- newArrayList test ---");
  5. System.out.println(objects);
  6. System.out.println("--- newArrayList test ---");
  7. ArrayList<Object> objects1 = Lists.newArrayList(objects);
  8. System.out.println(objects1);
  9. System.out.println("--- newArrayList test ---");
  10. ArrayList<String> strings = Lists.newArrayList("张三", "北京市海淀区");
  11. System.out.println(strings);

以下两个函数在构造 ArrayList 对象的时候给出了需要分配空间的大小:

  1. newArrayListWithCapacity(int initialArraySize)
  2. newArrayListWithExpectedSize(int estimatedSize)
  1. //如果你事先知道元素的个数,可以用 newArrayListWithCapacity 函数;如果你不能确定元素的个数,可以用newArrayListWithExpectedSize函数
  2. //这个方法就是直接返回一个10的数组。
  3. ArrayList<Object> objects = Lists.newArrayListWithCapacity(10);
  4. objects.add("123");
  5. System.out.println(objects);
  6. ArrayList<Object> objects1 = Lists.newArrayListWithExpectedSize(10);
  7. objects1.add("123");
  8. System.out.println(objects1);

在 newArrayListWithExpectedSize 函数里面调用了 computeArrayListCapacity(int arraySize) 函数,其实现如下:

  1. @VisibleForTesting
  2. static int computeArrayListCapacity(int arraySize) {
  3. checkArgument(arraySize >= 0);
  4.    
  5.   // TODO(kevinb): Figure out the right behavior, and document it
  6. return Ints.saturatedCast(5L + arraySize + (arraySize / 10));
  7. }

         返回的容量大小为 5L + arraySize + (arraySize / 10),当 arraySize 比较大的时候,给定大小和真正分配的容量之比为 10/11。

Lists 类还支持构造 LinkedListnewCopyOnWriteArrayList 对象,其函数接口为:

  1. newLinkedList()
  2. newLinkedList(Iterable<? extends E> elements)   
  3. newCopyOnWriteArrayList()
  4. newCopyOnWriteArrayList(Iterable<? extends E> elements)
  1. /* newLinkedList()
  2. newLinkedList(Iterable<? extends E> elements)   
  3. newCopyOnWriteArrayList()
  4. newCopyOnWriteArrayList(Iterable<? extends E> elements) */
  5. LinkedList<Object> objects = Lists.newLinkedList();
  6. objects.add("张三");
  7. objects.add("李四");
  8. System.out.println("--- newLinkedList ---");
  9. System.out.println(objects);
  10. ArrayList<Object> objects1 = Lists.newArrayList(objects);
  11. System.out.println("--- newLinkedList ---");
  12. System.out.println(objects1);
  13. System.out.println("--- newCopyOnWriteArrayList ---");
  14. CopyOnWriteArrayList<Object> objects2 = Lists.newCopyOnWriteArrayList();
  15. objects2.add("王五");
  16. objects2.add("张三");
  17. System.out.println(objects2);
  18. System.out.println("--- newCopyOnWriteArrayList ---");
  19. CopyOnWriteArrayList<Object> objects3 = Lists.newCopyOnWriteArrayList(objects2);
  20. System.out.println(objects3);

 

我们还可以将两个(或三个)类型相同的数据存放在一个list中,这样可以传入到只有一个参数的函数或者需要减少参数的函数中,这些函数如下:

  1. asList(@Nullable E first, E[] rest)
  2. asList(@Nullable E first, @Nullable E second, E[] rest)
  1. String str = "i love u";
  2. String[] strs = {"i like u", "i miss u"};
  3. List<String> strings = Lists.asList(str, strs);
  4. System.out.println(strings);

 

 Lists 类中 transform 函数可以根据传进来的 function 对 fromList 进行相应的处理,并将处理得到的结果存入到新的list对象中,这样有利于我们进行分析,函数接口如下:

public static <F, T> List<T> transform(List<F> fromList, Function<? super F, ? extends T> function)

  1. Function<String, Integer> strlen = new Function<String, Integer>() {
  2. public Integer apply(String from) {
  3. Preconditions.checkNotNull(from);
  4. return from.length();
  5. }
  6. };
  7. List<String> from = Lists.newArrayList("abc", "defg", "hijkl");
  8. List<Integer> to = Lists.transform(from, strlen);
  9. for (int i = 0; i < from.size(); i++) {
  10. System.out.printf("%s has length %d\n", from.get(i), to.get(i));
  11. }

 

 

Maps

        官方文档

Maps (Guava: Google Core Libraries for Java 27.0.1-jre API)icon-default.png?t=M0H8https://guava.dev/releases/27.0.1-jre/api/docs/com/google/common/collect/Maps.html com.google.common.collect.Maps 接口的声明:

  1. @GwtCompatible(emulated=true)
  2. public final class Maps
  3. extends Object
  1. newHashMap
  2. newHashMapWithExpectedSize
  3. newLinkedHashMap 
  4. ImmutableMap
  5. difference
  6. transformValues

测试

newHashMap

  1. HashMap<Object, Object> hashMap = Maps.newHashMap();
  2. for (int i = 0; i < 10; i++) {
  3. hashMap.put(i, i);
  4. }
  5. System.out.println("hashMap:" + hashMap);
  6. HashMap<Object, Object> hashMap1 = Maps.newHashMap(hashMap);
  7. System.out.println("hashMap1:" + hashMap1);

 newHashMapWithExpectedSize

  1. Map<Integer, Integer> map = Maps.newHashMapWithExpectedSize(3);
  2. map.put(1, 1);
  3. map.put(2, 2);
  4. map.put(3, 3);
  5. System.out.println("map:" + map); // map:{1=1, 2=2, 3=3}

 

 newLinkedHashMap

  1. Map<Integer, Integer> map = Maps.newLinkedHashMap();
  2. map.put(11, 11);
  3. System.out.println("map:" + map);
  4. LinkedHashMap<Integer, Integer> map1 = Maps.newLinkedHashMap(map);
  5. System.out.println("map1:" + map1);

 

 ImmutableMap

  1. ImmutableMap<String, String> a = ImmutableMap.of("a", "1");
  2. System.out.println(a);

 

difference

  1. Map<Integer, Integer> map = Maps.newHashMap();
  2. map.put(10, 10);
  3. Map<Integer, Integer> map1 = Maps.newHashMap();
  4. map1.put(10, 10);
  5. map1.put(20, 20);
  6. MapDifference<Integer, Integer> difference = Maps.difference(map, map1);
  7. System.out.println(difference.areEqual());
  8. System.out.println(difference.entriesInCommon());
  9. System.out.println(difference.entriesOnlyOnRight());
  10. System.out.println(difference.entriesOnlyOnLeft());
  11. System.out.println(difference.entriesDiffering());
  12. System.out.println(difference);

transformValues

  1. Map<String, Boolean> fromMap = Maps.newHashMap();
  2. fromMap.put("key", true);
  3. fromMap.put("value", false);
  4. // 对传入的元素取反
  5. System.out.println(Maps.transformValues(fromMap, (Function<Boolean, Object>) input -> !input));
  6. // value为假,则key变大写
  7. Maps.EntryTransformer<String, Boolean, String> entryTransformer = (key, value) -> value ? key : key.toUpperCase();
  8. System.out.println(Maps.transformEntries(fromMap, entryTransformer));

 

Sets 

         官方文档

Sets (Guava: Google Core Libraries for Java 27.0.1-jre API)icon-default.png?t=M0H8https://guava.dev/releases/27.0.1-jre/api/docs/com/google/common/collect/Sets.htmlcom.google.common.collect.Sets 接口的声明:

  1. @GwtCompatible(emulated=true)
  2. public final class Sets
  3. extends Object
  1. newHashSet
  2. filter
  3. difference
  4. symmetricDifference
  5. intersection
  6. union
  7. cartesianProduct
  8. powerSet

newHashSet

  1. HashSet<Object> objects = Sets.newHashSet();
  2. objects.add("张三");
  3. objects.add("李四");
  4. System.out.println(objects);

 

filter

  1. /**
  2. * filter:返回传入Set集合unfiltered中满足给定Predicate的元素集合Set
  3. */
  4. @Test
  5. public void testFilter() {
  6. Set<String> set = Sets.newHashSet("i like u", "i miss u", "i love u");
  7. Predicate<String> predicate = new Predicate<String>() {
  8. @Override
  9. public boolean apply(String input) {
  10. //过滤包含字母l的元素
  11. return input.contains("l");
  12. }
  13. };
  14. System.out.println(Sets.filter(set, predicate)); // [i like u, i love u]
  15. System.out.println(Sets.filter(set, input -> input.contains("l"))); // [i like u, i love u]
  16. }

difference

  1. /**
  2. * difference:返回两个set集合的差的不可修改SetView
  3. * A,B是两个集合,则所有属于A且不属于B的元素构成的集合,叫做A与B的差集
  4. */
  5. @Test
  6. public void testDifference() {
  7. Set<Integer> set1 = Sets.newHashSet(1, 2, 3, 4, 5);
  8. Set<Integer> set2 = Sets.newHashSet(1, 3, 5, 7, 9);
  9. System.out.println(Sets.difference(set1, set2)); // [2, 4]
  10. }

 

symmetricDifference

  1. /**
  2. * symmetricDifference:返回两个set集合的对称差的不可修改SetView
  3. * 对称差,即两个集合的对称差是只属于其中一个集合,而不属于另一个集合的元素组成的集合
  4. */
  5. @Test
  6. public void testSymmetricDifference() {
  7. Set<Integer> set1 = Sets.newHashSet(1, 2, 3, 4, 5);
  8. Set<Integer> set2 = Sets.newHashSet(1, 3, 5, 7, 9);
  9. System.out.println(Sets.symmetricDifference(set1, set2)); // [2, 4, 9, 7]
  10. }

 

intersection

  1. /**
  2. * intersection:返回两个set集合的交集的不可修改SetView
  3. * 两个集合A和集合B的交集是指含有所有既属于A又属于B的元素,而没有其他元素的集合
  4. */
  5. @Test
  6. public void testIntersection() {
  7. Set<Integer> set1 = Sets.newHashSet(1, 2, 3, 4, 5);
  8. Set<Integer> set2 = Sets.newHashSet(1, 3, 5, 7, 9);
  9. System.out.println(Sets.intersection(set1, set2)); // [1, 3, 5]
  10. }

Union

  1. /**
  2. * Union:返回两个set集合的并集的不可修改SetView
  3. * 若A和B是集合,则A和B并集是有所有A的元素和所有B的元素,而没有其他元素的集合
  4. */
  5. @Test
  6. public void testUnion() {
  7. Set<Integer> set1 = Sets.newHashSet(1, 2, 3, 4, 5);
  8. Set<Integer> set2 = Sets.newHashSet(1, 3, 5, 7, 9);
  9. System.out.println(Sets.union(set1, set2)); // [1, 2, 3, 4, 5, 9, 7]
  10. }

 cartesianProduct

  1. /**
  2. * cartesianProduct:返回通过从各给定集中选择一个元素所形成每一个可能的集合
  3. */
  4. @Test
  5. public void testCartesianProduct() {
  6. Set<String> set1 = Sets.newHashSet("i love u", "i hate u");
  7. Set<String> set2 = Sets.newHashSet("tom", "jerry");
  8. Set<List<String>> sets = Sets.cartesianProduct(set1, set2);
  9. System.out.println(sets); // [[i hate u, tom], [i hate u, jerry], [i love u, tom], [i love u, jerry]]
  10. }

powerSet

  1. /**
  2. * powerSet:返回一个set,包含给定set的所有可能父级集合
  3. */
  4. @Test
  5. public void testPowerSet() {
  6. Set<String> set1 = Sets.newHashSet("A", "B", "C");
  7. Set<Set<String>> sets = Sets.powerSet(set1);
  8. // for (Set<String> set : sets) {
  9. // System.out.println(set);
  10. // }
  11. System.out.println(Arrays.toString(sets.toArray())); // [[], [A], [B], [A, B], [C], [A, C], [B, C], [A, B, C]]
  12. }

 完整代码

        maven项目里用junit进行单元测试

  1. import com.google.common.base.Predicate;
  2. import com.google.common.collect.Sets;
  3. import org.junit.Test;
  4. import java.util.Arrays;
  5. import java.util.List;
  6. import java.util.Set;
  7. public class TestSets {
  8. /**
  9. * filter:返回传入Set集合unfiltered中满足给定Predicate的元素集合Set
  10. */
  11. @Test
  12. public void testFilter() {
  13. Set<String> set = Sets.newHashSet("i like u", "i miss u", "i love u");
  14. Predicate<String> predicate = new Predicate<String>() {
  15. @Override
  16. public boolean apply(String input) {
  17. //过滤包含字母l的元素
  18. return input.contains("l");
  19. }
  20. };
  21. System.out.println(Sets.filter(set, predicate)); // [i like u, i love u]
  22. System.out.println(Sets.filter(set, input -> input.contains("l"))); // [i like u, i love u]
  23. }
  24. /**
  25. * difference:返回两个set集合的差的不可修改SetView
  26. * A,B是两个集合,则所有属于A且不属于B的元素构成的集合,叫做A与B的差集
  27. */
  28. @Test
  29. public void testDifference() {
  30. Set<Integer> set1 = Sets.newHashSet(1, 2, 3, 4, 5);
  31. Set<Integer> set2 = Sets.newHashSet(1, 3, 5, 7, 9);
  32. System.out.println(Sets.difference(set1, set2)); // [2, 4]
  33. }
  34. /**
  35. * symmetricDifference:返回两个set集合的对称差的不可修改SetView
  36. * 对称差,即两个集合的对称差是只属于其中一个集合,而不属于另一个集合的元素组成的集合
  37. */
  38. @Test
  39. public void testSymmetricDifference() {
  40. Set<Integer> set1 = Sets.newHashSet(1, 2, 3, 4, 5);
  41. Set<Integer> set2 = Sets.newHashSet(1, 3, 5, 7, 9);
  42. System.out.println(Sets.symmetricDifference(set1, set2)); // [2, 4, 9, 7]
  43. }
  44. /**
  45. * intersection:返回两个set集合的交集的不可修改SetView
  46. * 两个集合A和集合B的交集是指含有所有既属于A又属于B的元素,而没有其他元素的集合
  47. */
  48. @Test
  49. public void testIntersection() {
  50. Set<Integer> set1 = Sets.newHashSet(1, 2, 3, 4, 5);
  51. Set<Integer> set2 = Sets.newHashSet(1, 3, 5, 7, 9);
  52. System.out.println(Sets.intersection(set1, set2)); // [1, 3, 5]
  53. }
  54. /**
  55. * Union:返回两个set集合的并集的不可修改SetView
  56. * 若A和B是集合,则A和B并集是有所有A的元素和所有B的元素,而没有其他元素的集合
  57. */
  58. @Test
  59. public void testUnion() {
  60. Set<Integer> set1 = Sets.newHashSet(1, 2, 3, 4, 5);
  61. Set<Integer> set2 = Sets.newHashSet(1, 3, 5, 7, 9);
  62. System.out.println(Sets.union(set1, set2)); // [1, 2, 3, 4, 5, 9, 7]
  63. }
  64. /**
  65. * cartesianProduct:返回通过从各给定集中选择一个元素所形成每一个可能的集合
  66. */
  67. @Test
  68. public void testCartesianProduct() {
  69. Set<String> set1 = Sets.newHashSet("i love u", "i hate u");
  70. Set<String> set2 = Sets.newHashSet("tom", "jerry");
  71. Set<List<String>> sets = Sets.cartesianProduct(set1, set2);
  72. System.out.println(sets); // [[i hate u, tom], [i hate u, jerry], [i love u, tom], [i love u, jerry]]
  73. }
  74. /**
  75. * powerSet:返回一个set,包含给定set的所有可能父级集合
  76. */
  77. @Test
  78. public void testPowerSet() {
  79. Set<String> set1 = Sets.newHashSet("A", "B", "C");
  80. Set<Set<String>> sets = Sets.powerSet(set1);
  81. // for (Set<String> set : sets) {
  82. // System.out.println(set);
  83. // }
  84. System.out.println(Arrays.toString(sets.toArray())); // [[], [A], [B], [A, B], [C], [A, C], [B, C], [A, B, C]]
  85. }
  86. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/828883
推荐阅读
相关标签
  

闽ICP备14008679号