开源工具包:

  • 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

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

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

    前言:俗话说“金三银四铜五”,不知道我要在这段时间找工作会不会很艰难.不管了,工作三年之后就当给自己放个暑假. 面试当中Collection(集合)是基础重点.我在网上看了几篇讲Collection的 ...

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

    前言:暑期应该开始了,因为小区对面的小学这两天早上都没有像以往那样一到七八点钟就人声喧闹.车水马龙. 前两篇文章介绍了Collection框架的主要接口和常用类,例如List.Set.Queue,和A ...

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

    JAVA之旅(十八)--基本数据类型的对象包装类,集合框架,数据结构,Collection,ArrayList,迭代器Iterator,List的使用 JAVA把完事万物都定义为对象,而我们想使用数据 ...

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

     集合框架(Collection  Framework)是Java最强大的子系统之一,位于java.util 包中.集合框架是一个复杂的接口与和类层次,提供了管理对象组的最新技术.Java集合框架标准 ...

  5. Java集合框架学习(一)List

    先附一张Java集合框架图. 从上面的集合框架图可以看到,Java集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射.Coll ...

  6. 集合框架(JCF/Java Collection Framework)

    集合的特点:1.数据的类型可以不同2.集合长度可变3.空间不固定集合也是对象,用于检索,存储以及传输对象集合框架的组成Collection接口和Map接口 Collection是Set接口和List接 ...

  7. Java集合框架学习笔记

    集合类的由来:对象用于封装特有数据,对象多了需要存储,如果对象的长度不确定,就使用集合存储. 集合特点1.用于存储对象的容器.2.集合的长度可变.3.集合中不可以存储基本类型 集合容器因为内部的数据结 ...

  8. Java集合框架(一)—— Collection、Iterator和Foreach的用法

    1.Java集合概述 在编程中,常常需要集中存放多个数据.当然我们可以使用数组来保存多个对象.但数组长度不可变化,一旦在初始化时指定了数组长度,则这个数组长度是不可变的,如果需要保存个数变化的数据,数 ...

  9. Java集合框架学习

    集合框架 集合框架的目标 该框架必须是高性能的.基本集合(动态数组,链表,树,哈希表)的实现必须是高效的. 该框架允许 不同类型的集合,以类似的方式工作,具有高度的互操作性. 对一个集合的扩展和适应必 ...

随机推荐

  1. Spark1.0.0 开发环境高速搭建

          在本系列博客中.为了解析一些概念.解析一些架构.代码測试.搭建了一个实验平台.例如以下图所看到的:       本实验平台是在一台物理机上搭建的.物理机的配置是16G内存,4核8线程CPU ...

  2. js的加载方式

    同步加载即<script>标签 异步加载即 动态插入<script>标签,动态修改<script>的src属性. Ajax加载.

  3. 【JavaScript】【译】编写高性能JavaScript

    英文链接:Writing Fast, Memory-Efficient JavaScript 很多JavaScript引擎,如Google的V8引擎(被Chrome和Node所用),是专门为需要快速执 ...

  4. Java图片处理(二)图片加水印

    图片加水印,是通过图片重叠绘制实现的.实现代码如下: public static void press(String pressImg, String pressText, String target ...

  5. hdu1050 Moving Tables

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1050 求区间上点的最大重叠次数. #include <stdio.h> #include &l ...

  6. Creating Your Own Server: The Socket API, Part 1

    转:http://www.linuxforu.com/2011/08/creating-your-own-server-the-socket-api-part-1/ By Pankaj Tanwar  ...

  7. InAction-MR的topK

    本来只是想拿搜狗的数据练练手的,却无意踏足MR的topK问题.经过几番波折,虽然现在看起来很简单,但是摸爬滚打中也学到了不少 数据是搜狗实验室下的搜索日志,格式大概为: 00:00:00 298219 ...

  8. 关于c#调用c/c++ dll遇到的问题总结

    前段时间公司做了个winform程序,需要调用c 的dll去读取卡号的程序,期间遇到些问题,下面来分享下 一.dll路径问题 相信很多开发者都会遇到这个问题,我总结了下我现在有3总方式去解决这个问题: ...

  9. (转)乐观的并发策略——基于CAS的自旋

    悲观者与乐观者的做事方式完全不一样,悲观者的人生观是一件事情我必须要百分之百完全控制才会去做,否则就认为这件事情一定会出问题:而乐观者的人生观则相反,凡事不管最终结果如何,他都会先尝试去做,大不了最后 ...

  10. [转]DllMain中不当操作导致死锁问题的分析——DllMain中要谨慎写代码(完结篇)

    在CSDN中发现这篇文章,讲解的比较详细,所以在这里备份一个.原文链接:http://blog.csdn.net/breaksoftware/article/details/8167641 DllMa ...