Google Collections

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

  • github地址:https://github.com/google/guava

  • 可以使用HugeChm把文档打包成chm格式

Demo

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.google.common.collect.ImmutableList;

public class Demo01 {

    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("a");
        list.add("b");
        list.add("c");
        //对原有的list进行包装,相当于原有List的一个视图,快照,不够安全
        List<String> readList = Collections.unmodifiableList(list);
        //readList.add("d");
        list.add("d");//改变原有List 视图也一起改变

        //对比Guava   对只读设置安全可靠 并且相对简单
        List<String> immutableList = ImmutableList.of("a","b","c");
        immutableList.add("d");

    }

}
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import com.google.common.base.Function;
import com.google.common.base.Functions;
import com.google.common.base.Predicate;
import com.google.common.collect.Collections2;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;

/**
 * 函数式编程 解耦
 * 1.Predicate 断言
 * 2.Function 函数
 * @author Matrix42
 *
 */
public class Demo02 {

    public static void main(String[] args) {
        test1();
        test2();
        test3();
    }

    //过滤器
    public static void test1(){
      //创建List 静态初始化
        List<String> list = Lists.newArrayList("moom","som","dad");
        //找出回文
        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 string : palindromeList) {
            System.out.println(string);
        }
    }

    //类型转换
    public static void test2(){
        Set<Long> timeSet = Sets.newHashSet();
        timeSet.add(10000000L);
        timeSet.add(999999999999999999L);
        timeSet.add(20000000000L);

        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 string : timeStrCol) {
            System.out.println(string);
        }
    }

    //组合式函数编程
    //确保容器中的字符串长度不超过5,超过进行截取,转换为大写
    public static void test3(){
        List<String> list = Lists.newArrayList("lorinda","haha","happiness");
        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();
            }
        };

        //对函数进行组合
        Function<String, String> f = Functions.compose(f1, f2);
        Collection<String> resultCol = Collections2.transform(list, f);

        for (String string : resultCol) {
            System.out.println(string);
        }
    }
}
import java.util.Set;
import com.google.common.base.Preconditions;
import com.google.common.collect.Constraint;
import com.google.common.collect.Constraints;
import com.google.common.collect.Sets;

/**
 * 加入约束条件:非空,长度验证
 * Constraint
 * @author Matrix42
 *
 */
public class Demo03 {

    public static void main(String[] args) {
        Set<String> sets = Sets.newHashSet();
        //创建约束
        Constraint<String> constraint = new Constraint<String>(){

            @Override
            public String checkElement(String element) {
                //非空验证
                Preconditions.checkNotNull(element);
                //长度验证
                Preconditions.checkArgument(element.length()>=5&&element.length()<=20);
                return element;
            }

        };

        Set<String> cs = Constraints.constrainedSet(sets, constraint);
        //cs.add(null);
        //cs.add("good");
        cs.add("lorinda");

        for (String string : cs) {
            System.out.println(string);
        }

    }

}
import java.util.Set;
import com.google.common.collect.Sets;
import com.google.common.collect.Sets.SetView;

/**
 * 集合的操作:交集 差集 并集
 * @author Matrix42
 *
 */
public class Demo04 {

    public static void main(String[] args) {
        Set<Integer> sets =Sets.newHashSet(1,2,3,4,5,6);
        Set<Integer> sets2 =Sets.newHashSet(3,4,5,6,7,8,9);

        //交集
        System.out.println("交集为:");
        SetView<Integer> intersection = Sets.intersection(sets, sets2);
        for (Integer integer : intersection) {
            System.out.println(integer);
        }
        //差集
        System.out.println("差集为:");
        SetView<Integer> diff =Sets.difference(sets, sets2);
        for(Integer temp:diff){
            System.out.println(temp);
        }
        //并集
        System.out.println("并集为:");
        SetView<Integer> union =Sets.union(sets, sets2);
        for(Integer temp:union){
            System.out.println(temp);
        }
    }
}
  • Multiset MultiMap BiMap

Multiset:

import java.util.Set;
import com.google.common.collect.HashMultiset;
import com.google.common.collect.Multiset;
/**
 * 统计单词出现的次数
 * Multiset 无序 可重复 .count 增强了可读性 操作简单
 * @author Matrix42
 *
 */
public class Demo02 {

    public static void main(String[] args) {
        String str ="this is a cat and that is a mice where is the food";
        //分割字符串
        String[] strArray = str.split(" ");
        //存储到Multiset
        Multiset<String> set = HashMultiset.create();
        for (String string : strArray) {
            set.add(string);
        }
        //获取所有的单词
        Set<String> letters = set.elementSet();
        for (String string : letters) {
            System.out.println(string+"--->"+set.count(string));
        }

    }

}

MultiMap:

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;

/**
 * 分析查看 教师 教授的没门课程
 * MultiMap key-value key可以重复
 * @author Matrix42
 *
 */
public class Demo03 {

    public static void main(String[] args) {
        Map<String, String> cours = new HashMap<>();
        //加入测试数据
        cours.put("改革开放", "邓小平");
        cours.put("三个代表", "江泽民");
        cours.put("科学发展观", "胡锦涛");
        cours.put("和谐社会", "胡锦涛");
        cours.put("八荣八耻", "胡锦涛");
        cours.put("...", "习近平");

        //Multimap
        Multimap<String,String> teachers = ArrayListMultimap.create();

        Iterator<Map.Entry<String, String>> it = cours.entrySet().iterator();

        while(it.hasNext()){
            Map.Entry<String, String> entry = it.next();
            String key = entry.getKey();
            String value = entry.getValue();

            //教师 -- 课程
            teachers.put(value, key);
        }

        //查看Multimap
        Set<String> leyset = teachers.keySet();
        for (String string : leyset) {
            Collection<String> col = teachers.get(string);
            System.out.println(string+"-->"+col);
        }

    }

}

BiMap:

import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;

/**
 * HashMap 键唯一,值可以重复
 * BiMap:双向Map(Bidirectional Map ) 键与值都不能重复(unique -valued map)
 * @author Matrix42
 *
 */
public class Demo04 {

    public static void main(String[] args) {
        BiMap<String, String> biMap = HashBiMap.create();
        biMap.put("lorinda", "admin@lorinda.cc");
        biMap.put("Matrix42", "admin@sundeqiang.cn");
        //通过邮箱找用户
        String user = biMap.inverse().get("admin@lorinda.cc");
        System.out.println(user);
        System.out.println(biMap.inverse().inverse().get(user));
    }

}

* Table

import java.util.Map;
import java.util.Set;

import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import com.google.common.collect.Table.Cell;
import com.google.common.collect.Tables;

/**
 * 双键的Map -->Table -->rowKey+columnKey+value
 * * 1、方法
 *  所有的行数据:cellSet()
 *  所有的学生: rowKeySet()
 *  所有的课程:columnKeySet()
 *  所有的成绩: values()
 *  学生对应的课程: rowMap() +get(学生)
 *                  row(学生)
 *  课程对应的学生: columnMap +get(课程)
 *                  column(课程)
 * @author Matrix42
 *
 */
public class Demo08 {

    public static void main(String[] args) {
        Table<String, String, Integer> tables = HashBasedTable.create();
        //测试数据
        tables.put("a", "javase", 80);
        tables.put("b", "javase", 90);
        tables.put("a", "oracle", 100);
        tables.put("c", "oracle", 95);

        //所有行数据
        Set<Cell<String, String, Integer>> cells = tables.cellSet();
        for (Cell<String, String, Integer> cell : cells) {
            System.out.println(cell.getRowKey()+"-->"+cell.getColumnKey()+"-->"+cell.getValue());
        }

        System.out.println("==============学生查看成绩=============");
        System.out.print("学生\t");
        //所有课程
        Set<String> cours = tables.columnKeySet();
        for (String string : cours) {
            System.out.print(string+"\t");
        }
        System.out.println();

        //所有学生
        Set<String> stus = tables.rowKeySet();
        for (String string : stus) {
            System.out.print(string+"\t");
            Map<String, Integer> scores = tables.row(string);
            for (String string2 : cours) {
                System.out.print(scores.get(string2)+"\t");
            }
            System.out.println();
        }

      //所有的学生
        Set<String> stus1 =tables.rowKeySet();
        for(String stu:stus1){
            System.out.print(stu+"\t");
            Map<String,Integer> scores =tables.row(stu);
            for(String c:cours){
                System.out.print(scores.get(c)+"\t");
            }
            System.out.println();
        }

        System.out.println("==========课程查看成绩==============");
        System.out.print("课程\t");
        //所有的学生
        Set<String> stuSet =tables.rowKeySet();
        for(String t:stuSet){
            System.out.print(t+"\t");
        }
        System.out.println();
        //所有的课程
        Set<String> courSet =tables.columnKeySet();
        for(String c:courSet){
            System.out.print(c+"\t");
            Map<String,Integer> scores =tables.column(c);
            for(String s:stuSet){
                System.out.print(scores.get(s)+"\t");
            }
            System.out.println();
        }
        System.out.println("===========转换===========");
        Table<String,String,Integer> tables2 =Tables.transpose(tables);
        //所有的行数据
        Set<Cell<String,String,Integer>> cells2 =tables2.cellSet();
        for(Cell<String,String,Integer> temp:cells2){
            System.out.println(temp.getRowKey()+"-->"+temp.getColumnKey()+"-->"+temp.getValue());
        }
    }
}