Guava Collection

原文地址:http://www.cnblogs.com/dooor/p/5285484.html

开源工具包:

    • Guava : Google Collection

    • Apache:Commons 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

/**

 * 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("学生\t");

        //所有的课程

        Set<String> cours = table.columnKeySet();

        for(String t : cours){

            System.out.print(t+"\t");

        }

        System.out.println();

        //所有的学生

        Set<String> stus = table.rowKeySet();

        for(String stu:stus){

            System.out.print(stu+"\t");

            Map<String,Integer> scores  = table.row(stu);

            for(String c:cours){

                System.out.print(scores.get(c)+"\t");

            }

            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

猜你喜欢

转载自blog.csdn.net/masery/article/details/86473873