• 集合框架学习之Guava Collection


    开源工具包:

    • Guava : Google Collection
    • ApacheCommons Collecton

     

    1.1 Google Collections

    Guava:google的工程师利用传说中的“20%时间”开发的集合库,它是对jdk提供的扩展,提供了很多使用的类来简化代码

    jar包:https://code.google.com/p/guava-libraries/

    源码下载:

    • 下载git工具:(易于本地增加分支和分布式的特性)
      • msysgit:http://code.google.com/p/msysgit/downloads/list
    • 命令:git clone 网络路径本地文件夹(不存在或空文件夹)
     
    复制代码
    /**
     * Guava集合框架
     * @author qjc
     *
     * 2016-3-12
     */
    public class Demo {
        /**
         * 只读设置
         */
        @Test
        public void testGuava1(){
            List<String> list = new ArrayList<>();
            list.add("a");
            list.add("b");
            list.add("c");
            //对原有的list进行包装,相当于原有List的一个试图,快照,不够安全
            List<String> readList = Collections.unmodifiableList(list);
            //java.lang.UnsupportedOperationException
    //        readList.add("d");
            list.add("d"); //改变原有List 试图也一起改变
            //对比查看初始化List guava对只读设置 安全可靠,并且相对简单
            List<String> immutableList = ImmutableList.of("a","b","c");
            immutableList.add("d");//java.lang.UnsupportedOperationException
        }
        /**
         * 函数式编程:过滤器
         */
        @Test
        public void testGuava2(){
            //创建List 静态初始化
            List<String> list = Lists.newArrayList("moon","son","dad","refer");
            //找出回文 palindronme backwoeds mirror words
            Collection<String> palindromeList = Collections2.filter(list, new Predicate<String>() {
                @Override
                public boolean apply(String input) {
                    //业务逻辑
                    return new StringBuilder(input).reverse().toString().equals(input);
                }
            });
            for(String temp : palindromeList){
                System.out.println(temp);
                //输出结果:dad refer
            }
        }
        /**
         *  函数式编程:转换
         */
        @Test
        public void testGuava3(){
            Set<Long> timeSet = Sets.newHashSet();
            //类型转换
            timeSet.add(19990701L);
            timeSet.add(20080808L);
            timeSet.add(20161212L);
            Collection<String> timeStrCol = Collections2.transform(timeSet, new Function<Long,String>(){
                @Override
                public String apply(Long input) {
                    return new SimpleDateFormat("yyyy-MM-dd").format(input);
                }
            });
            for(String temp : timeStrCol){
                System.out.println(temp);
            }
        }
        /**
         * 组合式函数编程
         *     确保容器中的字符串长度不超过5,超过进行截取,然后全部大写
         */
        @Test
        public void testGuava4(){
            List<String> list = Lists.newArrayList("abcde","good","happiness");
            //确保容器中的字符串长度不超过5
            Function<String, String> f1 = new Function<String, String>() {
                @Override
                public String apply(String input) {
                    return input.length()>5?input.substring(0, 5):input;
                }
            };
            //转成大写
            Function<String, String> f2 = new Function<String, String>() {
                @Override
                public String apply(String input) {
                    return input.toUpperCase();
                }
            };
            //String = f2(f1(String))
            Function<String, String> f = Functions.compose(f1, f2);
            Collection<String> resultCol = Collections2.transform(list, f);
            for(String str:resultCol){
                System.out.println(str);
                /*
                 * 输出结果:
                           ABCDE
                           GOOD
                           HAPPI
                   */
            }
        }
        /**
         * 加入约束:非空、长度验证
         */
        @Test
        public void testGuava5(){
            Set<String> sets = Sets.newHashSet();
            //创建约束
            Constraint<String> constraint = new Constraint<String>() {
     
                @Override
                public String checkElement(String element) {
                    //非空验证
                    Preconditions.checkNotNull(element);
                    //长度验证 5~20位字符串
                    Preconditions.checkArgument(element.length()>=5 && element.length()<20);
                    return element;
                }
            };
            Set<String> cs = Constraints.constrainedSet(sets, constraint);
    //        cs.add(null);    //java.lang.NullPointerException
    //        cs.add("abcd"); //java.lang.IllegalArgumentException
            cs.add("abcde");//ok
        }
        /**
         * 集合操作:交集、差集、并集
         */
        @Test
        public void testGuava6(){
            Set<Integer> set1 =Sets.newHashSet(1,2,3,4);
            Set<Integer> set2 =Sets.newHashSet(3,4,5,6);
            //交集
            SetView<Integer> inter = Sets.intersection(set1, set2);
            //差集
            SetView<Integer> diff = Sets.difference(set1, set2);
            //并集
            SetView<Integer> union = Sets.union(set1, set2);
            //遍历输出:交集 :3,4 差集:1,2,5,6 并集:1,2,3,4,5,6,
        }
        /**
         * 统计单词出现的次数
         * 1、HashMap 分拣存储+面向对象思维   --->判断
         * 2、Multiset:无序可重复  .count()  增强可读性+操作简单
         */
        @Test
        public void testGuava7(){
            String str = "this is a cat and that is mice where is the food";
            //分割字符串
            String[] arr = str.split(" ");
            //存储到Multiset中
            Multiset<String> set = HashMultiset.create();
            for(String ss:arr){
                set.add(ss);
            }
            //获取所有的单词set
            Set<String> letters = set.elementSet();
            for(String temp:letters){
                System.out.println(temp+":"+set.count(temp));
            }
        }
        /**
         * 分析查看每个教师教授的没门课程
         * Multimap   key也可以重复
         */
        @Test
        public void testGuava8(){
            Map<String, String> map = new HashMap<String, String>();
            //加入测试数据
            map.put("改革开放", "邓爷爷");
            map.put("三个代表", "江主席");
            map.put("科学发展观", "胡主席");
            map.put("和谐社会", "胡主席");
            map.put("八荣八耻", "胡主席");
            //Multimap
            Multimap<String, String> teacher = ArrayListMultimap.create();
            //迭代器
            Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
            while(it.hasNext()){
                Map.Entry<String, String> entry = it.next();
                String key = entry.getKey(); //课程
                String value = entry.getValue(); //教师
                //教师--->课程
                teacher.put(value, key);
            }
            //查看Multimap
            Set<String> keySet = teacher.keySet();
            for(String key:keySet){
                Collection<String> col = teacher.get(key);
                System.out.println(key+":"+col);
            }
        }
        /**
         * HashMap 键唯一,值可以重复
         * BiMap:双向Map(bidirectional Map) 键与值不能重复(unique -valued map)
         */
        @Test
        public void testGuava9(){
            BiMap<String, String> biMap = HashBiMap.create();
            biMap.put("sina", "@sina.com");
            biMap.put("qq", "@qq.com");
            //通过邮箱找用户
            String user = biMap.inverse().get("@sina.com");
            System.out.println(user);
            System.out.println(biMap.inverse().inverse()==biMap);
        }
        /**
         * 双键的Map -->Table --->rowKey+columnKye+value
         */
        @Test
        public void testGuava10(){
            Table<String, String, Integer> table = HashBasedTable.create();
            //测试数据
            table.put("龙傲天", "java", 50);
            table.put("龙傲天", "oracle", 60);
            table.put("福尔康", "java", 70);
            table.put("福尔康", "oracle", 100);
            //所有的行数据
            Set<Cell<String, String, Integer>> cells = table.cellSet();
            for(Cell<String, String, Integer> temp : cells){
        System.out.println(temp.getRowKey()+":"+temp.getColumnKey()+":"+temp.getValue());
            }
            /*
            龙傲天:java:50
            龙傲天:oracle:60
            福尔康:java:70
            福尔康:oracle:100*/
            System.out.println("=======学生查看成绩========");
            System.out.print("学生	");
            //所有的课程
            Set<String> cours = table.columnKeySet();
            for(String t : cours){
                System.out.print(t+"	");
            }
            System.out.println();
            //所有的学生
            Set<String> stus = table.rowKeySet();
            for(String stu:stus){
                System.out.print(stu+"	");
                Map<String,Integer> scores  = table.row(stu);
                for(String c:cours){
                    System.out.print(scores.get(c)+"	");
                }
                System.out.println();
            }
            /*
            学生       java     oracle    
            龙傲天    50     60    
            福尔康    70     100*/
        }
    }
    复制代码

    小结:

    1.只读设置:immutableList

    2.函数式编程:解耦

         1) predicate

      2)Function

      工具:

    Collections2.filter()过滤器

    Collections2.transfer()转换

    Functions.compose()组合式函数编程                    

    3.加入约束条件:非空  长度验证

    Constraint

    Preconditions

    4.集合的操作:交集差集并集

    Sets.intersection()

    Sets.difference()

    Sets.union()

    5.Multiset  Multimap  BiMap

    6.Table

  • 相关阅读:
    剑桥雅思写作高分范文ESSAY37
    剑桥雅思写作高分范文ESSAY36
    剑桥雅思写作高分范文ESSAY35
    剑桥雅思写作高分范文ESSAY34
    剑桥雅思写作高分范文ESSAY33
    剑桥雅思写作高分范文ESSAY32
    剑桥雅思写作高分范文ESSAY31
    Python 案例 004 (计算当前时间是一年中的第几天)
    Python案例 003 (一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数)
    Python 案例002(获取不同数据区间的和)
  • 原文地址:https://www.cnblogs.com/fengli9998/p/7875042.html
Copyright © 2020-2023  润新知