集合框架学习之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("学生\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

时间: 2024-08-02 22:53:47

集合框架学习之Guava Collection的相关文章

JavaSE中Collection集合框架学习笔记(2)——拒绝重复内容的Set和支持队列操作的Queue

前言:俗话说“金三银四铜五”,不知道我要在这段时间找工作会不会很艰难.不管了,工作三年之后就当给自己放个暑假. 面试当中Collection(集合)是基础重点.我在网上看了几篇讲Collection的文章,大多都是以罗列记忆点的形式书写的,没有谈论实现细节和逻辑原理.作为个人笔记无可厚非,但是并不利于他人学习.希望能通过这种比较“费劲”的讲解,帮助我自己.也帮助读者们更好地学习Java.掌握Java. 无论你跟我一样需要应聘,还是说在校学生学习Java基础,都对入门和进一步启发学习有所帮助.(关

JavaSE中Collection集合框架学习笔记(3)——遍历对象的Iterator和收集对象后的排序

前言:暑期应该开始了,因为小区对面的小学这两天早上都没有像以往那样一到七八点钟就人声喧闹.车水马龙. 前两篇文章介绍了Collection框架的主要接口和常用类,例如List.Set.Queue,和ArrayList.HashSet.LinkedList等等.根据核心框架图,相信我们都已经对Collection这个JavaSE中最常用API之一有一个较为全面的认识. 这个学习过程,还可以推及到其他常用开源框架和公司项目的学习和熟悉上面.借助开发工具或说明文档,先是对项目整体有一个宏观的认识,再根

Java集合框架学习笔记之集合与Collection API

一.CollectionAPI 集合是一系列对象的聚集(Collection).集合在程序设计中是一种重要的数据接口.Java中提供了有关集合的类库称为CollectionAPI. 集合实际上是用一个对象代表一组对象,在集合中的每个对象称为一个元素.在集合中的各个元素的具体类型可以不同,但一般说来,它们都是由相同的类派生出来的(而这一点并不难做到,因为Java中的所有类都是Object的子类).在从集合中检索出各个元素是,常常要根据其具体类型不同而进行相应的强制类型转换. Collection

集合框架— —学习总结

学习的集合框架示意图: 一.Collection 特点:无序,可重复 (1)功能与方法: 二.代码演练 package Java20170402; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; class Student01{ private String name; private String student

JAVA之旅(十八)——基本数据类型的对象包装类,集合框架,数据结构,Collection,ArrayList,迭代器Iterator,List的使用

JAVA之旅(十八)--基本数据类型的对象包装类,集合框架,数据结构,Collection,ArrayList,迭代器Iterator,List的使用 JAVA把完事万物都定义为对象,而我们想使用数据类型也是可以引用的 一.基本数据类型的对象包装类 左为基本数据类型,又为引用数据类型 byte Byte int Integer long Long boolean Booleab float Float double Double char Character 我们拿Integer来举例子 //整

Java学习关于集合框架的基础接口--Collection接口

 集合框架(Collection  Framework)是Java最强大的子系统之一,位于java.util 包中.集合框架是一个复杂的接口与和类层次,提供了管理对象组的最新技术.Java集合框架标准化了程序处理对象组的方式. 集合框架在设计上需要满足几个目标.首先,框架必须是高性能的.基本集合(动态数组.链表.树以及哈希表)的实现是高效率的.很少需要手动编写这些数据引擎中的某一个.其次,框架必须允许不同类型的集合以类似的方式进行工作,并且具有高度的互操作性.再次,扩展或改造必须易于实现.为了满

Java集合框架学习笔记

本文为学习笔记,学习课程为慕课网Java入门第三季中的集合框架部分,若需要研究文中的代码,可前往下载.http://www.imooc.com/learn/110 1. List(Collection子接口) 1.1 实例化 List list = new ArrayList(); ??List是一个接口,不可直接实例化,通常情况下ArrayList实现类进行实例化. 1.2 增 1.2.1 add(obj) ??直接将obj对象加入List末位. 1.2.2 add(i, obj) ??将ob

黑马程序员——JAVA集合框架学习总结

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- www.itheima.com 要学好java的集合框架,必须掌握此图: Java集合框架很全面,从大的来说.它包括两种类型: 1.一种是以collection为根接口的集合. 2.另一种是由map为根接口的<key,value>的“图”. 而collection之下的set接口和list接口又有不同: 1.Set 接口继承 Collection,但不允许重复,使用自己内部的一个排列机制.

黑马程序员------Java集合框架学习总结

Java培训.Android培训.iOS培训..Net培训.期待您的交流 一.综述 所有集合类都位于java.util包下.集合中只能保存对象(保存对象的引用变量).(数组既可以保存基本类型的数据也可以保存对象). Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些接口或实现类. 二.Collection接口 Collction: List:有序(元素存入集合的顺序和取出的顺序一致),元素都有索引.