Guava工具总结

Table双键Map

public class OTest {

    public static void main(String[] args) {
        Map<String, Map<String, Integer>> map = new HashMap<>();
        //存放元素
        Map<String, Integer> workMap = new HashMap<>();
        workMap.put("Jan", 20);
        workMap.put("Feb", 28);
        map.put("Hydra", workMap);
        Map<String, Integer> workMap2 = new HashMap<>();
        workMap2.put("Jan", 18);
        workMap2.put("Feb", 16);
        map.put("Trunks", workMap2);

        //取出元素
        Integer dayCount = map.get("Hydra").get("Jan");
        System.out.println(dayCount);

        // 1、定义 一个表格
        Table<String, String, Integer> table = HashBasedTable.create();
        //存放元素
        table.put("Hydra", "Jan", 20);
        table.put("Hydra", "Feb", 28);

        table.put("Trunks", "Jan", 28);
        table.put("Trunks", "Feb", 16);

        // 1、取出元素
        Integer dayCount2 = table.get("Hydra", "Jan");
        System.out.println(dayCount2);

        // 2、rowKey或columnKey的集合
        Set<String> rowKeys = table.rowKeySet();
        System.out.println(rowKeys);
        Set<String> columnKeys = table.columnKeySet();
        System.out.println(columnKeys);

        // 3、value集合
        Collection<Integer> values = table.values();
        System.out.println(values);
        // 4、转为嵌套的Map
        Map<String, Map<String, Integer>> map2 = table.rowMap();
        System.out.println(map2);
        Map<String, Map<String, Integer>> map3 = table.columnMap();
        System.out.println(map3);
    }
}

BiMap双向Map

public class OTest2 {

    public static void main(String[] args) {
        BiMap<String, String> biMap = HashBiMap.create();
        biMap.put("Hydra", "Programmer");
        biMap.put("Tony", "IronMan");
        biMap.put("Thanos", "Titan");
        //使用key获取value
        System.out.println(biMap.get("Tony"));

        BiMap<String, String> inverse = biMap.inverse();
        //使用value获取key
        System.out.println(inverse.get("Titan"));

        // 1、反转后操作的影响上面我们用inverse方法反转了原来BiMap的键值映射,但是这个反转后的BiMap并不是一个新的对象,
        //    它实现了一种视图的关联,所以对反转后的BiMap执行的所有操作会作用于原先的BiMap上。
        HashBiMap<String, String> biMap1 = HashBiMap.create();
        biMap1.put("Hydra", "Programmer");
        biMap1.put("Tony", "IronMan");
        biMap1.put("Thanos", "Titan");
        BiMap<String, String> inverse1 = biMap1.inverse();

        inverse1.put("IronMan", "Stark");
        System.out.println(biMap1);
        // 2、value不可重复
        // BiMap的底层继承了Map,我们知道在Map中key是不允许重复的,而双向的BiMap中key和value可以认为处于等价地位,因此在这个基础上加了限制,value也是不允许重复的。看一下下面的代码:
        // 这样代码无法正常结束,会抛出一个IllegalArgumentException异常:
        try {
            HashBiMap<String,String> biMap2 = HashBiMap.create();
            biMap2.put("Tony","IronMan");
            biMap2.put("Stark","IronMan");
        } catch (Exception e) {
            if (e instanceof IllegalArgumentException) {
                System.out.println("IllegalArgumentException异常");
            }
        }
        // 3、获取value为set集合
        Set<String> values = biMap.values();
        System.out.println(values);
    }
}

Multimap - 多值Map

public class OTest3 {
    public static void main(String[] args) {
        Multimap<String, Integer> multimap = ArrayListMultimap.create();
        multimap.put("day", 1);
        multimap.put("day", 2);
        multimap.put("day", 8);
        multimap.put("month", 3);
        System.out.println(multimap);

        // 1、获取值的集合
        Collection<Integer> day = multimap.get("day");

        // 如果在创建时指定为ArrayListMultimap类型,那么get方法将返回一个List
        ArrayListMultimap<String, Integer> multimap2 = ArrayListMultimap.create();
        List<Integer> day2 = multimap2.get("day");
        System.out.println(day2);
        // 同理,你还可以创建HashMultimap、TreeMultimap等类型的Multimap。

        // Multimap的get方法会返回一个非null的集合,但是这个集合的内容可能是空,看一下下面的例子
        System.out.println(multimap.get("day"));
        System.out.println(multimap.get("year"));

        // 2、操作get后的集合
        // 和BiMap的使用类似,使用get方法返回的集合也不是一个独立的对象,可以理解为集合视图的关联,对这个新集合的操作仍然会作用于原始的Multimap上,看一下下面的例子:
        ArrayListMultimap<String, Integer> multimap3 = ArrayListMultimap.create();
        multimap3.put("day", 1);
        multimap3.put("day", 2);
        multimap3.put("day", 8);
        multimap3.put("month", 3);

        List<Integer> day3 = multimap3.get("day");
        List<Integer> month3 = multimap3.get("month");
        //这个0是下标
        day3.remove(0);
        month3.add(12);
        System.out.println(multimap);

        // 3、转换为Map
        // 使用asMap方法,可以将Multimap转换为Map<K,Collection>的形式,同样这个Map也可以看做一个关联的视图,在这个Map上的操作会作用于原始的Multimap。
        Map<String, Collection<Integer>> map = multimap.asMap();
        for (String key : map.keySet()) {
            System.out.println(key + ":" + map.get(key));
        }
        map.get("day").add(20);
        System.out.println(multimap);
    }
}

RangeMap范围Map

public class OTest4 {

    public static void main(String[] args) {
        // 先看一个例子,假设我们要根据分数对考试成绩进行分类,那么代码中就会出现这样丑陋的if-else
        System.out.println(getRank(80));

        // 而guava中的RangeMap描述了一种从区间到特定值的映射关系,让我们能够以更为优雅的方法来书写代码。下面用RangeMap改造上面的代码并进行测试:
        RangeMap<Integer, String> rangeMap = TreeRangeMap.create();

        rangeMap.put(Range.closedOpen(0, 60), "fail");
        rangeMap.put(Range.closed(60, 90), "satisfactory");
        rangeMap.put(Range.openClosed(90, 100), "excellent");

        System.out.println(rangeMap.get(59));
        System.out.println(rangeMap.get(60));
        System.out.println(rangeMap.get(90));
        System.out.println(rangeMap.get(91));

        rangeMap.remove(Range.closed(70,80));
        System.out.println(rangeMap.get(75));
    }

    public static String getRank(int score) {
        if (0 <= score && score < 60) {
            return "fail";
        } else if (60 <= score && score <= 90) {
            return "satisfactory";
        } else if (90 < score && score <= 100) {
            return "excellent";
        }
        return null;
    }
}

ClassToInstanceMap实例Map

public class OTest5 {
    public static void main(String[] args) {
        ClassToInstanceMap<Object> instanceMap = MutableClassToInstanceMap.create();
        SysUser user = new SysUser();
        SysDept dept = new SysDept();

        instanceMap.putInstance(SysUser.class, user);
        instanceMap.putInstance(SysDept.class, dept);
        // 使用ClassToInstanceMap这种方式有什么好处呢?
        // 首先,这里最明显的就是在取出对象时省去了复杂的强制类型转换,避免了手动进行类型转换的错误。
        // 其次,我们可以看一下ClassToInstanceMap接口的定义,它是带有泛型的:
        // public interface ClassToInstanceMap<B> extends Map<Class<? extends B>,B>{...}
        ClassToInstanceMap<Map> instanceMap2 = MutableClassToInstanceMap.create();
        HashMap<String, Object> hashMap = new HashMap<>();
        TreeMap<String, Object> treeMap = new TreeMap<>();
        ArrayList<Object> list = new ArrayList<>();

        instanceMap.putInstance(HashMap.class, hashMap);
        instanceMap.putInstance(TreeMap.class, treeMap);
        System.out.println(instanceMap2);
        // 这样是可以正常执行的,因为HashMap和TreeMap都集成了Map父类,但是如果想放入其他类型,就会编译报错:
        // instanceMap2.putInstance(ArrayList.class, list);
    }
}
posted @ 2024-08-30 17:12  倔强的老铁  阅读(15)  评论(0编辑  收藏  举报