美文网首页技术分享
Guava - 强大的集合工具Maps

Guava - 强大的集合工具Maps

作者: 一点温柔 | 来源:发表于2019-11-07 19:27 被阅读0次

一、简介

Guava提供了一个非常强大的集合处理工具 - Maps.它提供了我们工作中许多常见的Map处理场景.如Mapdiff功能、常见的一堆对象唯一索引操作、转换普通的复杂Map<String ,List<Object>MultiMap<String ,Object>,降低此类场景处理的复杂度等等.

二、常用方法

1、唯一索引方法 - uniqueIndex()

当我们平时处理一堆对象,并且将对象通过唯一的属性封装成Map的时候,就可以使用Maps.uniqueIndex(Iterable<V> values, Function<? super V, K> keyFunction)方法.它可以返回将keyFunction中的处理结果作为每个对象的key,对应对象作为value的不可以变Map - ImmutableMap.

实验代码:

        //测试唯一索引方法 Maps - uniqueIndex
        ImmutableMap<Integer, String> immutableMap = Maps.uniqueIndex(Lists.newArrayList("a1000000", "b20000000"), new Function<String, Integer>() {
            @Override
            public Integer apply(String input) {
                return input.length();
            }
        });
        //测试索引方法 Multimaps - index
        System.out.println("==================测试Maps-niqueIndex()方法===================" + immutableMap);

        Multimap<Integer, String> multimap = Multimaps.index(Lists.newArrayList("a1000000", "b20000000", "a1000000"), new Function<String, Integer>() {
            @Override
            public Integer apply(String input) {
                return input.length();
            }
        });

实验结果:

==================测试Maps-niqueIndex()方法==================={8=a1000000, 9=b20000000}
==================测试Multimaps-Index方法==================={8=[a1000000, a1000000], 9=[b20000000]}
值得注意的是:

Maps.uniqueIndex(()中不能存在指定唯一索引相同的索引节点,否则会抛出非法异常IllegalArgumentException: Multiple entries with same key.

2、diff方法 - difference()

Maps还提供了一个非常实用的diff方法 - difference( Map<? extends K, ? extends V> left, Map<? extends K, ? extends V> right).
它会对两个集合进行比较,并返回一个MapDifference<K, V>对象.此对象分别提供了可以获取两个mapdiff后的维恩图中各个部分的值.

实验代码:

        //测试diff
        Map<String, String> map1 = Maps.newHashMap();
        map1.put("a", "a1");
        map1.put("b", "b1");
        map1.put("c", "c1");

        Map<String, String> map2 = Maps.newHashMap();
        map2.put("a", "a1");
        map2.put("b", "b2");
        map2.put("d", "d2");

        MapDifference<String, String> mapDifference = Maps.difference(map1, map2);
        System.out.println("==================测试Maps-difference()方法===================" + mapDifference);

        System.out.println("==================测试diff - entriesInCommon()方法===================" + mapDifference.entriesInCommon());
        System.out.println("==================测试diff - entriesOnlyOnLeft()方法===================" + mapDifference.entriesOnlyOnLeft());
        System.out.println("==================测试diff - entriesOnlyOnRight()方法===================" + mapDifference.entriesOnlyOnRight());
        System.out.println("==================测试diff - entriesDiffering()方法===================" + mapDifference.entriesDiffering());
        System.out.println("==================测试diff - areEqual()方法===================" + mapDifference.areEqual());

实验结果:

==================测试Maps-difference()方法===================not equal: only on left={c=c1}: only on right={d=d2}: value differences={b=(b1, b2)}
==================测试diff - entriesInCommon()方法==================={a=a1}
==================测试diff - entriesOnlyOnLeft()方法==================={c=c1}
==================测试diff - entriesOnlyOnRight()方法==================={d=d2}
==================测试diff - entriesDiffering()方法==================={b=(b1, b2)}
==================测试diff - areEqual()方法===================false

可以看出MapDifference对象会将diff后的结果都记录了下来:
a、entriesInCommon()返回两个map中key和value都相同的记录.
b、entriesOnlyOnLeft()返回两个map中left - map独有的记录.
c、entriesOnlyOnRight()返回两个map中right map 独有的记录.
d、entriesDiffering()返回两个map中key相同value不同的记录.
e、areEqual()返回两个map是否完全相同 true orElse false.

三、BiMap相关方法

Guava将BiMap的公共方法划分到Maps工具类中,因为他们认为BiMap也是Map.
常见的实用方法如下:

1、获取线程安全的BiMap方法 - synchronizedBiMap()

Maps工具类提供了支持返回一个线程安全的BiMap方法 - synchronizedBiMap(BiMap<K, V> bimap).

实验代码如下:

       //测试BiMap线程安全方法 -  synchronizedBiMap
        BiMap<String, Integer> synchronizedBiMap = Maps.synchronizedBiMap(biMap);
        System.out.println("==================测试BiMap - synchronizedBiMap()方法===================" + synchronizedBiMap);
2、获取不可变的BiMap方法 - unmodifiableBiMap()

使用unmodifiableBiMap()方法,可以获得指定BiMap的不可变集.

实验代码:

        //测试BiMap不可变方法 -  unmodifiableBiMap
        BiMap<String, Integer> unmodifiableBiMap = Maps.unmodifiableBiMap(synchronizedBiMap);
        System.out.println("==================测试BiMap - unmodifiableBiMap()方法===================" + unmodifiableBiMap);

......未完待续

相关文章

网友评论

    本文标题:Guava - 强大的集合工具Maps

    本文链接:https://www.haomeiwen.com/subject/pwzdbctx.html