guava集合篇

这是我参与新手入门的第2篇文章

一. 集合连接和分割

1. Joiner 连接器

  1. 拼接字符串之List(数组)

    jdk

            List<String> list = new ArrayList<>();
            list.add("1");
            list.add(null);
            list.add("2");
            StringBuilder sb = new StringBuilder();
            list.stream().filter(e -> StrUtil.isNotBlank(e)).forEach(e ->
                    sb.append(e).append(",")
            );
            // 省略检查sb是否有值
            sb.setLength(sb.length() - 1);
            System.err.println(sb.toString());//1,2
    复制代码

    guava这么做

              String join = Joiner.on(",").skipNulls().join(list);
              System.err.println(join);//1,2
    复制代码

    Hutool 也可以实现简单的连接

     CollUtil.join(list, ",");//1,null,2
    复制代码
  2. 拼接字符串之Map

    guava

     		Map<String, String> map = new HashMap<>();
            map.put("001", "张三");
            map.put("002", "李四");
    
            String guava = Joiner.on("&").withKeyValueSeparator("=").join(map);
            System.err.println(guava);//001=张三&002=李四
    复制代码

2. Splitter分割器

  1. 字符串分割成List

            String str = "001, ,002,,003,";
            List<String> guava = Splitter.on(",").trimResults().omitEmptyStrings().splitToList(str);
            // trimResults()解决001,后的, , omitEmptyStrings解决002,,
            System.err.println(guava);// [001, 002, 003]
            // 迭代器
            Iterable<String> ite = Splitter.on(",").trimResults().omitEmptyStrings().split(str);
            ite.forEach(e->{
                // ...
            });
    复制代码
  2. 字符串分割成类Map

        String str = "001=张三&002=李四&003=王五";
        Map<String, String> guava = Splitter.on("&").withKeyValueSeparator("=").split(str);
        System.err.println(guava);//{001=张三, 002=李四, 003=王五

复制代码

二. Map

1. 二维数据结构 Table<R, C, V>

  1. 由两个key决定一个value,类似于坐标系

  2. 解决Map<key,Map< key,value>>的情况

  3. 常用 HashBasedTable、TreeBasedTable

    java vs guava 代码

    1. java v1 不定义对象,判断多,代码不简洁

       @Test
          public void testJdkNoDefinitionObject() {
              Map<Object, Map<Object, Object>> jdk = new HashMap<Object, Map<Object, Object>>(2);
              Map<Object, Object> x1 = jdk.get("x1");
              if (x1 != null) {
                  x1.put("y1", 1);
              } else {
                  x1 = new HashMap<Object, Object>(2);
                  x1.put("y1", 1);
              }
              // 同理放入x2,y2,2,省略....
              // 取值,如获取 x1,y1对应的值
              jdk.get("x1").get("y1");
          }
      复制代码
    2. java v2 定义对象,代码少,但需要额外定义对象

     @Test
        public void testJdkDefinitionObject() {
            // jdk 定义对象,代码少,但需要额外定义对象
            Map<Object, Object> jdk = new HashMap<Object, Object>(2);
            jdk.put(new DemoKey("x1", "y1"), 1);
            // 同理放入x2,y2,2
            jdk.put(new DemoKey("x2", "y2"), 2);
            // 取值,如获取 x1,y1对应的值
            jdk.get(new DemoKey("x1", "y1"));
        }
            class DemoKey {
            private String x;
            private String y;
            // 重写Equale 和HashCode 方法
            public DemoKey(String x, String y) {
                this.x = x;
                this.y = y;
            }
        }
    复制代码
    1. guava 代码简洁明了
        @Test
        public void testGuava() {
            // guava 代码简洁明了
            HashBasedTable<Object, Object, Object> guava = HashBasedTable.create();
            // 存值
            guava.put("x1", "y1", 1);
            guava.put("x2", "y2", 2);
            // 取值
            guava.get("x1", "y1");
        }
    复制代码

2. 一键多值的 Multimap<K, V>

  1. 一个key对应多个value的map

  2. 解决自己new value集合的问题

  3. 常用ArrayListMultimap、HashMultimap

    代码

    1. java

          @Test
          public void jdkTest(){
              Map<String, List<Object>> jdk = new HashMap<String, List<Object>>(3);
              // 存值 A:A1
              List<Object> value = jdk.get("A");
              if (value != null) {
                  value.add("A1");
              } else {
                  value = new ArrayList<Object>();
                  value.add("A1");
              }
              // 存值 A:A2 ,省略
          }
      复制代码
    2. guava

         @Test
          public void guavaTest(){
              Multimap<String, String> guava = ArrayListMultimap.create();
              guava.put("A", "A1");
              guava.put("A", "A2");
              System.err.println(guava.size());// 2
              // 取值,value 类似于视图,操作会影响原集合
              Collection<String> value = guava.get("A");
          }
      复制代码

3. key和value 可翻转的BiMap

  1. 根据key取value 经常用,某些场景下根据value取key

  2. key和value 唯一

    1. 相同的key 以最后为准
     @Test
        public void test(){
            HashBiMap<Object, Object> bimap = HashBiMap.create();
            bimap.put("001", "张三");
            bimap.put("002", "李四");
            bimap.put("002", "王五");
            BiMap<Object, Object> inverse = bimap.inverse();
            System.err.println(inverse.get("张三")); //001
            System.err.println(inverse.get("李四")); // null
            System.err.println(inverse.get("王五")); // 002
        }
    复制代码
    1. put相同的value会异常

       bimap.put("003", "王五");
       >>
      java.lang.IllegalArgumentException: value already present: 王五
      复制代码

      解决办法是用 forcePut

      // 暴力,以最后插入的数据为准,省去烦恼
      bimap.forcePut("003", "王五");
      复制代码

三.SET

### 1. 值重复的Multiset 
复制代码

用来计数,比如有字符串

复制代码

比如有字符串,需要统计里面a出现的次数,可以这么做


String str = "a,b,c,a,b,a,c,b,e,r";
List<String> list = Splitter.on(",").splitToList(str);
HashMultiset<String> guava = HashMultiset.create();
guava.addAll(list);
System.err.println(guava.count("a"));// 3
复制代码

当然Multiset也实现了Collection接口,具有集合的一些常规操作

  1. 集合求差交并

    有以下两个集合

            HashSet<String> set1 = Sets.newHashSet("张三001", "张三002", "张三003");
            HashSet<String> set2 = Sets.newHashSet("张三002", "张三003", "张三004");
    复制代码

    求差集

           
    复制代码

    求交集

      		HashSet<String> set1 = Sets.newHashSet("张三001", "张三002", "张三003");
            HashSet<String> set2 = Sets.newHashSet("张三002", "张三003", "张三004");
    		// 求差集(注意根据参数位置是第一个集合有,第二个集合没有)
            Sets.SetView<String> difference = Sets.difference(set1, set2);
            System.err.println(difference);// [张三001]
    		// 求交集
         Sets.SetView<String> intersection = Sets.intersection(set1, set2);
            System.err.println(intersection);//[张三002, 张三003]
     	// 求并集
            Sets.SetView<String> union = Sets.union(set1, set2);
            System.err.println(union); // [张三002, 张三001, 张三003, 张三004]
    复制代码

    求并集

            
    复制代码

    如果集合里面是java Bean,记得重写equals和hashCode。

四. …

:创建List

jdk这么做

List<Object> jdk = new ArrayList<>();
jdk.add("A");
jdk.add("B");
复制代码

guava这么做

List<String> guava = Lists.newArrayList("A", "B");
复制代码

Lists. Maps.

// 1
public static final ImmutableSet<Color> GOOGLE_COLORS =
   ImmutableSet.<Color>builder()
       .addAll(WEBSAFE_COLORS)
       .add(new Color(0, 191, 255))
       .build(); 
//2
ImmutableSet.of("a", "b", "c", "a", "d", "b")
复制代码

以上仅为抛转,更多Guava精彩,大家一起发现!

参考

wizardforcel.gitbooks.io/guava-tutor…

blog.csdn.net/wwwdc1012/a…

github.com/google/guav…

www.yiibai.com/guava/guava…

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享