Guava:谷歌开发的集合库,通过build path->Add External JARs 把guava.jar包加进去。

版本控制工具:.CVS .SVN .git
所以需要下载git客户端。 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");//对这个视图增操作,错误,抛出java.lang.UnsupportedOperationException(不被支持的异常)。
list.add("d"); //正确,改变原有List,视图也一起改变,没有达到真正的目的,所以不够安全。 // guava对只读设置 安全可靠,并且相对简单
List<String> immutableList =ImmutableList.of("a", "b", "c"); //初始化List
immutableList.add("d");//java.lang.UnsupportedOperationException
}
} 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
*
* 工具:Collections2.filter() 过滤器
* Collections2.transfer() 转换
* Functions.compose()组合式函数编程
*/
public class Demo02 {
public static void main(String[] args) {
//组合式函数编程
//确保容器中的字符串长度不超过5,超过进行截取,后全部大写
List<String> list =Lists.newArrayList("bjsxt","good","happiness");//静态创建List,
//确保容器中的字符串长度不超过5,超过进行截取
Function<String,String> f1 =new Function<String,String>(){
@Override
public String apply(String input) {
return input.length()>?input.substring(,):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 temp:resultCol){
System.out.println(temp);
}
}
/**
* 转换
*/
public static void test2(){
//类型转换
Set<Long> timeSet =Sets.newHashSet();
timeSet.add(10000000L);
timeSet.add(99999999999999999L);
timeSet.add(2000000000L);
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);
}
}
/**
* 过滤器
*/
public static void test1(){
//创建List 静态初始化
List<String> list =Lists.newArrayList("moom","son","dad","bjsxt","refer");
//找出回文 palindrome backwords 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);
}
}
} 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
* Preconditions
* Constraints
*/
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);
//长度验证 5-20为字符串
Preconditions.checkArgument(element.length()>= && element.length()<=);
return element;
}
};
Set<String> cs =Constraints.constrainedSet(sets, constraint);
//cs.add(null); //java.lang.NullPointerException
//cs.add("good"); //java.lang.IllegalArgumentException
cs.add("bjsxt");
for(String str:cs){
System.out.println(str);
}
}
} import com.google.common.collect.Sets;//谷歌的jar包
import com.google.common.collect.Sets.SetView;
/**
* 集合的操作:交集、差集、并集
* Sets.intersection()
* Sets.difference()
* Sets.union();
*/
public class Demo04 {
public static void main(String[] args) {
Set<Integer> sets =Sets.newHashSet(,,,,,);
Set<Integer> sets2 =Sets.newHashSet(,,,,,,);
//交集
System.out.println("交集为:");
SetView<Integer> intersection =Sets.intersection(sets, sets2);
for(Integer temp:intersection){
System.out.println(temp);//
}
//差集
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);//
}
}
} import com.google.common.collect.HashMultiset;
import com.google.common.collect.Multiset;
/**
* 统计单词出现的次数
* 1、HashMap 分拣存储+面向对象思维 -->判断
* 2、Multiset :无序+可重复 .count() 增强了可读性 +操作简单
* @author Administrator
*
*/
public class Demo05 {
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 strTemp:strArray){
set.add(strTemp);
}
//获取所有的单词 Set
Set<String> letters =set.elementSet();
for(String temp:letters){
System.out.println(temp+"-->"+set.count(temp));//统计人员访问网站的 次数
}
/*mice-->1
that-->1
cat-->1
is-->3
food-->1
a-->2
the-->1
where-->1
this-->1
and-->1*/
}
} import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
/**
* 分析查看 教师 教授的每门课程
* Multimap :key-value key可以重复
*/
public class Demo06 {
public static void main(String[] args) {
Map<String,String> cours =new HashMap<String,String>();
//加入测试数据
cours.put("改革开放", "邓爷爷");
cours.put("三个代表", "江主席");
cours.put("科学发展观", "胡主席");
cours.put("和谐社会", "胡主席");
cours.put("八荣八耻", "胡主席");
cours.put(".1..", "习主席");
cours.put("..2.", "习主席");
cours.put(".3..", "习主席");
//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> keyset =teachers.keySet();
for(String key:keyset){
Collection<String> col =teachers.get(key);
System.out.println(key+"-->"+col);
}
/*邓爷爷-->[改革开放]
江主席-->[三个代表]
习主席-->[.3.., ..2., .1..]
胡主席-->[科学发展观, 八荣八耻, 和谐社会]*/
}
} import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
/**
* HashMap 键唯一,值可以重复
* BiMap:双向Map(Bidirectional Map ) 键与值都不能重复(unique -valued map)
*/
public class Demo07 {
public static void main(String[] args) {
BiMap<String,String> bimap=HashBiMap.create();
bimap.put("bjsxt", "bjsxt@sina.com");
bimap.put("good","good@qq.com");
//通过邮箱找用户
String user =bimap.inverse().get("good@qq.com");
System.out.println(user);//good
System.out.println(bimap.inverse().inverse()==bimap);//true
}
} 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//类似于一个表格,2个作为key,另外一个作为value.
* 1、方法
* 所有的行数据:cellSet()
* 所有的学生: rowKeySet()//查看其中一列
* 所有的课程:columnKeySet()//查看另一列
* 所有的成绩: values()//查看所有的value
* 学生对应的课程: rowMap() +get(学生)
* row(学生)
* 课程对应的学生: columnMap +get(课程)
* column(课程)
*/
public class Demo08 {
public static void main(String[] args) {
Table<String,String,Integer> tables=HashBasedTable.create();
//测试数据
tables.put("a", "javase", );
tables.put("b", "javase", );
tables.put("a", "oracle", );
tables.put("c", "oracle", ); //所有的行数据
Set<Cell<String,String,Integer>> cells =tables.cellSet();
for(Cell<String,String,Integer> temp:cells){
System.out.println(temp.getRowKey()+"-->"+temp.getColumnKey()+"-->"+temp.getValue());
} System.out.println("==========学生查看成绩==============");
System.out.print("学生\t");
//所有的课程
Set<String> cours =tables.columnKeySet();
for(String t:cours){
System.out.print(t+"\t");
}
System.out.println();
//所有的学生
Set<String> stus =tables.rowKeySet();
for(String stu:stus){
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());
} } } import org.apache.commons.collections4.Predicate;
import org.apache.commons.collections4.PredicateUtils;
import org.apache.commons.collections4.functors.EqualPredicate;
import org.apache.commons.collections4.functors.NotNullPredicate;
import org.apache.commons.collections4.functors.UniquePredicate;
import org.apache.commons.collections4.list.PredicatedList;
/**
函数式编程 之 Predicate 断言
封装条件或判别式 if..else替代
1、 new EqualPredicate<类型>(值)
EqualPredicate.equalPredicate(值);
2、NotNullPredicate.INSTANCE
3、UniquePredicate.uniquePredicate()
4、自定义
new Predicate() +evaluate
PredicateUtils.allPredicate(可以传2个以上的断言器),andPredicate(只能传2个断言器),anyPredicate(多个断言器,只要其中一个 为true即可)
PredicatedXxx.predicatedXxx(容器,判断)
* @author Administrator
*
*/
public class Demo01 {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
System.out.println("======自定义判断======");
//自定义的判别式
Predicate<String> selfPre =new Predicate<String>(){
@Override
public boolean evaluate(String object) {
return object.length()>= && object.length()<=;
}};
Predicate notNull=NotNullPredicate.notNullPredicate();
Predicate all =PredicateUtils.allPredicate(notNull,selfPre);//多个断言器
List<String> list =PredicatedList.predicatedList(new ArrayList<String>(),all);//用这个断言器来限制容器。
list.add("bjsxt");
list.add(null);//报异常
list.add("bj");//报异常
}
/**
* 判断唯一
*/
public static void unique(){
System.out.println("====唯一性判断====");
Predicate<Long> uniquePre =UniquePredicate.uniquePredicate();
List<Long> list =PredicatedList.predicatedList(new ArrayList<Long>(), uniquePre);
list.add(100L);
list.add(200L);
list.add(100L); //出现重复值,抛出异常
} /**
* 判断非空
*/
public static void notNull(){
System.out.println("====非空判断====");
Predicate notNull0 = NotNullPredicate.INSTANCE;
Predicate notNull = NotNullPredicate.notNullPredicate();
//String str ="bjs";
String str = null;
System.out.println(notNull.evaluate(str)); //如果非空为true ,否则为false
//添加容器值的判断
List<Long> list =PredicatedList.predicatedList(new ArrayList<Long>(), notNull);//要求容器list不能添加null值。
list.add(1000L);
list.add(null); //验证失败,出现异常
} /**
* 比较相等判断
*/
public static void equal(){
System.out.println("======相等判断======");
Predicate<String> pre0 =new EqualPredicate<String>("bjsxt");//实例化一个对象
Predicate<String> pre =EqualPredicate.equalPredicate("bjsxt");//创建对象
boolean flag =pre.evaluate("bj");//是否相等
System.out.println(flag);
}
} import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.Predicate;
import org.apache.commons.collections4.Transformer;
import org.apache.commons.collections4.functors.SwitchTransformer; /**
解耦,业务处理与判断进行分类
函数式编程 Transformer 类型转化
1、new Transformer() +transform
2、SwitchTransformer
CollectionUtils.collect(容器,转换器)
*/
public class Demo02 {
public static void main(String[] args) {
System.out.println("===自定义类型转换==");
//判别式
Predicate<Employee> isLow=new Predicate<Employee>(){//匿名内部类
@Override
public boolean evaluate(Employee emp) {
return emp.getSalary()<;
}
};
Predicate<Employee> isHigh=new Predicate<Employee>(){//匿名内部类
@Override
public boolean evaluate(Employee emp) {
return emp.getSalary()>=;
}
};
Predicate[] pres ={isLow,isHigh}; //转换,将Employee转成Level,
Transformer<Employee,Level> lowTrans =new Transformer<Employee,Level>(){
@Override
public Level transform(Employee input) {
return new Level(input.getName(),"卖身中");
}};
Transformer<Employee,Level> highTrans =new Transformer<Employee,Level>(){
@Override
public Level transform(Employee input) {
return new Level(input.getName(),"养身中");
}};
Transformer[] trans ={lowTrans,highTrans};
//二者进行了关联
Transformer switchTrans =new SwitchTransformer(pres, trans, null);
//容器
List<Employee> list =new ArrayList<Employee>();
list.add(new Employee("老马",));
list.add(new Employee("老裴",));
Collection<Level> levelList = CollectionUtils.collect(list,switchTrans);//参数为容器和转换规则
//遍历容器
Iterator<Level> levelIt =levelList.iterator();
while(levelIt.hasNext()){
System.out.println(levelIt.next());
/*(码农:老马,水平:养身中)
(码农:老裴,水平:卖身中)*/
}
}
/**
* 内置类型的转换
*/
public static void inner(){
System.out.println("===内置类型转换 长整形时间日期,转成指定格式的字符串==");
//类型转换器,将long类型转成String,
Transformer<Long,String> trans =new Transformer<Long,String>(){
@Override
public String transform(Long input) {
return new SimpleDateFormat("yyyy年MM月dd日").format(input);
}};
//容器
List<Long> list =new ArrayList<Long>();
list.add(999999999999L);
list.add(300000000L);
//工具类 ,程序猿出钱---开发商---农民工出力
Collection<String> result=CollectionUtils.collect(list, trans);//将容器和类型转换器连接起来
//遍历查看结果
for(String time:result){
System.out.println(time);
}
}
} /**
* 员工类
* @author Administrator
*
*/
public class Employee {
private String name;
private double salary;
//alt +/
public Employee() {
}
//alt+shift+s o
public Employee(String name, double salary) {
super();
this.name = name;
this.salary = salary;
}
//alt+shift+s +r tab 回车 shift+tab 回车
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
@Override
public String toString() {
return "(码农:"+this.name+",敲砖钱:"+this.salary+")";
} } /**
* 等级类
* @author Administrator
*
*/
public class Level {
private String name;
private String level;
public Level() {
// TODO Auto-generated constructor stub
}
public Level(String name, String level) {
super();
this.name = name;
this.level = level;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
@Override
public String toString() {
return "(码农:"+this.name+",水平:"+this.level+")";
}
} import org.apache.commons.collections4.Closure;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.Predicate;
import org.apache.commons.collections4.functors.ChainedClosure;
import org.apache.commons.collections4.functors.IfClosure;
import org.apache.commons.collections4.functors.WhileClosure;
/**
函数式编程 Closure 闭包 封装特定的业务功能
1、Closure
2、IfClosure IfClosure.ifClosure(断言,功能1,功能2)
3、WhileClosure WhileClosure.whileClosure(断言,功能,标识)
4、ChainedClosure.chainedClosure(功能列表);
CollectionUtils.forAllDo(容器,功能类对象);
*/
public class Demo03 {
public static void main(String[] args) {
basic();
ifClosure();
whileClosure();
chainClosure();
}
/**
* 折上减 先打折商品,进行9折,满百再减20
*/
public static void chainClosure(){
List<Goods> goodsList =new ArrayList<Goods>();
goodsList.add(new Goods("javase视频1",,true));
goodsList.add(new Goods("javaee视频2",,false));
goodsList.add(new Goods("高新技术视频",,false)); //满百减20
Closure<Goods> subtract=new Closure<Goods>(){
public void execute(Goods goods) {
if(goods.getPrice()>=){
goods.setPrice(goods.getPrice()-);
}
}};
//打折
Closure<Goods> discount=new Closure<Goods>(){
public void execute(Goods goods) {
if(goods.isDiscount()){
goods.setPrice(goods.getPrice()*0.9);
}
}}; //链式操作
Closure<Goods> chainClo=ChainedClosure.chainedClosure(discount,subtract); //关联
CollectionUtils.forAllDo(goodsList,chainClo); //查看操作后的数据
for(Goods temp:goodsList){
System.out.println(temp);
/*(商品:javase视频1,价格:88.0,是否打折:是)
(商品:javaee视频2,价格:80.0,是否打折:否)
(商品:高新技术视频,价格:80.0,是否打折:否)*/ } } /**
* 确保所有的员工工资都大于10000,如果已经超过的不再上涨
*/
public static void whileClosure(){
//数据
List<Employee> empList =new ArrayList<Employee>();
empList.add(new Employee("bjsxt",));
empList.add(new Employee("is",));
empList.add(new Employee("good",)); //业务功能 每次上涨0.2
Closure<Employee> cols=new Closure<Employee>(){
public void execute(Employee emp) {
emp.setSalary(emp.getSalary()*1.2);
}}; //判断
Predicate<Employee> empPre=new Predicate<Employee>(){
@Override
public boolean evaluate(Employee emp) {
return emp.getSalary()<;
}
};
//false 表示 while结构 先判断后执行 true do..while 先执行后判断
Closure<Employee> whileCols =WhileClosure.whileClosure(empPre, cols, false);//empPre为true则进入cols, //工具类
CollectionUtils.forAllDo(empList, whileCols) ; //操作后的数据
Iterator<Employee> empIt=empList.iterator();
while(empIt.hasNext()){
System.out.println(empIt.next());
/*(码农:bjsxt,敲砖钱:20000.0)
(码农:is,敲砖钱:10000.0)
(码农:good,敲砖钱:10368.0) 涨到超过一万为止。*/ }
}
/**
* 二选一 如果是打折商品,进行9折,否则满百减20
*/
public static void ifClosure(){
List<Goods> goodsList =new ArrayList<Goods>();
goodsList.add(new Goods("javase视频1",,true));
goodsList.add(new Goods("javaee视频2",,false));
goodsList.add(new Goods("高新技术视频",,false)); //满百减20
Closure<Goods> subtract=new Closure<Goods>(){
public void execute(Goods goods) {
if(goods.getPrice()>=){
goods.setPrice(goods.getPrice()-);
}
}};
//打折
Closure<Goods> discount=new Closure<Goods>(){
public void execute(Goods goods) {
if(goods.isDiscount()){
goods.setPrice(goods.getPrice()*0.9);
}
}}; //判断
Predicate<Goods> pre=new Predicate<Goods>(){
public boolean evaluate(Goods goods) {
return goods.isDiscount();
}}; //二选一
Closure<Goods> ifClo=IfClosure.ifClosure(pre,subtract,discount); //关联
CollectionUtils.forAllDo(goodsList,ifClo); //查看操作后的数据
for(Goods temp:goodsList){
System.out.println(temp);
/*(商品:javase视频,价格:108.0,是否打折:是)
(商品:javaee视频,价格:80.0,是否打折:否)
(商品:高新技术视频,价格:80.0,是否打折:否)*/
}
}
/**
* 基本操作
*/
public static void basic(){
//数据
List<Employee> empList =new ArrayList<Employee>();
empList.add(new Employee("bjsxt",));
empList.add(new Employee("is",));
empList.add(new Employee("good",)); //业务功能
Closure<Employee> cols=new Closure<Employee>(){//匿名内部类对象
public void execute(Employee emp) {
emp.setSalary(emp.getSalary()*1.2);//工资加倍
}}; //工具类
CollectionUtils.forAllDo(empList, cols) ; //操作后的数据
Iterator<Employee> empIt=empList.iterator();
while(empIt.hasNext()){
System.out.println(empIt.next());
/*(码农:bjsxt,敲砖钱:24000.0)
(码农:is,敲砖钱:12000.0)
(码农:good,敲砖钱:6000.0)*/
}
} } public class Goods {
private String name;
private double price;
//折扣
private boolean discount;
public Goods() {
// TODO Auto-generated constructor stub
}
public Goods(String name, double price, boolean discount) {
super();
this.name = name;
this.price = price;
this.discount = discount;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public boolean isDiscount() {
return discount;
}
public void setDiscount(boolean discount) {
this.discount = discount;
} @Override
public String toString() {
return "(商品:"+this.name+",价格:"+this.price+",是否打折:"+(discount?"是":"否")+")";
}
} import org.apache.commons.collections4.CollectionUtils;
/**
* 集合操作
* 1、并集
* CollectionUtils.union();
* 2、交集
* CollectionUtils.intersection();
* CollectionUtils.retainAll();
* 3、差集
* CollectionUtils.subtract();
*/
public class Demo04 {
public static void main(String[] args) {
Set<Integer> set1 =new HashSet<Integer>();
set1.add();
set1.add();
set1.add(); Set<Integer> set2 =new HashSet<Integer>();
set2.add();
set2.add();
set2.add(); //并集
System.out.println("=========并集============");
Collection<Integer> col =CollectionUtils.union(set1,set2);
for(Integer temp:col){
System.out.println(temp);
}
//交集
System.out.println("=========交集============");
//col =CollectionUtils.intersection(set1, set2);
col =CollectionUtils.retainAll(set1, set2);
for(Integer temp:col){
System.out.println(temp);
}
//差集
System.out.println("=========差集============");
col =CollectionUtils.subtract(set1, set2);
for(Integer temp:col){
System.out.println(temp);
}
}
} 队列:
import java.util.Queue;
import org.apache.commons.collections4.Predicate;
import org.apache.commons.collections4.functors.NotNullPredicate;
import org.apache.commons.collections4.queue.CircularFifoQueue;
import org.apache.commons.collections4.queue.PredicatedQueue;
import org.apache.commons.collections4.queue.UnmodifiableQueue;
/**
Queue队列(先进先出),栈(后进先出)
1、循环队列:CircularFifoQueue
2、只读队列:不可改变队列 UnmodifiableQueue
3、断言队列:PredicatedQueue.predicatedQueue()
*/
public class Demo05 {
public static void main(String[] args) {
circular();
readOnly();
predicate();
}
/**
* 断言队列
*/
public static void predicate(){
//循环队列
CircularFifoQueue<String> que =new CircularFifoQueue<String>();
que.add("a");
que.add("b");
que.add("c");
Predicate notNull=NotNullPredicate.INSTANCE;
//包装成对应的队列
Queue<String> que2=PredicatedQueue.predicatedQueue(que, notNull);
que2.add(null);
}
/**
* 只读队列
*/
public static void readOnly(){
//循环队列
CircularFifoQueue<String> que =new CircularFifoQueue<String>();
que.add("a");
que.add("b");
que.add("c");
Queue<String> readOnlyQue =UnmodifiableQueue.unmodifiableQueue(que);
readOnlyQue.add("d");
}
/**
* 循环队列
*/
public static void circular(){
//循环队列
CircularFifoQueue<String> que =new CircularFifoQueue<String>();
que.add("a");
que.add("b");
que.add("c");
//查看
for(int i=;i<que.size();i++){
System.out.println(que.get(i));
}
}
} import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import org.apache.commons.collections4.BidiMap;
import org.apache.commons.collections4.IterableMap;
import org.apache.commons.collections4.MapIterator;
import org.apache.commons.collections4.Predicate;
import org.apache.commons.collections4.bidimap.DualHashBidiMap;
import org.apache.commons.collections4.iterators.ArrayListIterator;
import org.apache.commons.collections4.iterators.FilterIterator;
import org.apache.commons.collections4.iterators.LoopingIterator;
import org.apache.commons.collections4.iterators.UniqueFilterIterator;
import org.apache.commons.collections4.map.HashedMap; /**
迭代器的扩展
1、MapIterator 以后不再使用map.keySet.iterator访问
接口IterableMap,实现类 HashedMap
2、UniqueFilterIterator 去重迭代器
3、FilterIterator 自定义过滤 +Predicate
4、LoopingIterator 循环迭代器
5、ArrayListIterator 数组迭代器
*/
public class Demo06 {
public static void main(String[] args) {
mapIt();
uniqueIt();
filterIt();
loopIt();
arrayIt();
}
/**
* 数组迭代器
*/
public static void arrayIt(){
System.out.println("===== 数组迭代器 ====");
int[] arr ={,,,,};
//数组迭代器
Iterator<Integer> it0 =new ArrayListIterator<Integer>(arr);
//指定起始索引和结束索引
Iterator<Integer> it =new ArrayListIterator<Integer>(arr,,);
while(it.hasNext()){
System.out.println(it.next());//2,3
}
}
/**
* 循环迭代器
*/
public static void loopIt(){
System.out.println("===== 循环迭代器 ====");
List<String> list =new ArrayList<String>();
list.add("refer");
list.add("dad");
list.add("bjsxt");
list.add("moom"); Iterator<String> it =new LoopingIterator(list);
for(int i=;i<;i++){
System.out.println(it.next());
/*refer
dad
bjsxt
moom
refer
dad
bjsxt
moom*/
}
}
/**
* 自定义迭代器
*/
public static void filterIt(){
System.out.println("=====自定义迭代器 ====");
List<String> list =new ArrayList<String>();
list.add("refer");
list.add("dad");
list.add("bjsxt");
list.add("moom");
//自定义条件判断
Predicate<String> pre =new Predicate<String>(){
public boolean evaluate(String value) {
//回文判断
return new StringBuilder(value).reverse().toString().equals(value);
}};
//去除重复的过滤器
Iterator<String> it =new FilterIterator(list.iterator(),pre);
while(it.hasNext()){
System.out.println(it.next());
/*refer
dad
moom*/
}
}
/**
* 去重迭代器
*/
public static void uniqueIt(){
System.out.println("=====去重迭代器 ====");
List<String> list =new ArrayList<String>();
list.add("a");
list.add("b");
list.add("a");
//去除重复的过滤器
Iterator<String> it =new UniqueFilterIterator(list.iterator());
while(it.hasNext()){
System.out.println(it.next());
/*a
b*/
}
}
/**
* map迭代器
*/
public static void mapIt(){
System.out.println("=====map迭代器====");
IterableMap<String,String> map =new HashedMap<String,String>();
map.put("a","bjsxt");
map.put("b", "sxt");
map.put("c", "good");
//使用 MapIterator
MapIterator<String,String> it =map.mapIterator();
while(it.hasNext()){
String key =it.next();
String value =it.getValue();
System.out.println(key+"-->"+value);
/*a-->bjsxt
c-->good
b-->sxt*/
}
}
} import org.apache.commons.collections4.BidiMap;
import org.apache.commons.collections4.MapIterator;
import org.apache.commons.collections4.bidimap.DualHashBidiMap;
import org.apache.commons.collections4.bidimap.DualTreeBidiMap;
/**
双向Map 要求键与值都不能重复
接口BidiMap inverseBidiMap()
实现类1、DualTreeBidiMap :有序
实现类2、DualHashBidiMap :无序
*/
public class Demo07 {
public static void main(String[] args) {
hashMap();
treeMap();
}
/**
* 有序的双向Map(key会自动排列)
*/
public static void treeMap(){
System.out.println("=====有序的双向Map====");
BidiMap<String,String> map =new DualTreeBidiMap<String,String>();
map.put("zbj", "bj@test.com");
map.put("sxt", "sxt@qq.com");//{sxt=sxt@qq.com, zbj=bj@test.com}
//遍历查看
MapIterator<String,String> it =map.inverseBidiMap().mapIterator();//{bj@test.com=zbj, sxt@qq.com=sxt}
while(it.hasNext()){
String key =it.next();
String value =it.getValue();
System.out.println(key+"-->"+value);
//bj@test.com-->zbj
//sxt@qq.com-->sxt
}
} /**
* 无序的双向Map
*/
public static void hashMap(){
System.out.println("=====无序的双向Map====");
BidiMap<String,String> map =new DualHashBidiMap<String,String>();
map.put("bj", "bj@test.com");
map.put("sxt", "sxt@qq.com");//{sxt=sxt@qq.com, bj=bj@test.com}
//反转
System.out.println(map.inverseBidiMap().get("sxt@qq.com"));//先要反转,然后通过value找到key,sxt
//遍历查看
MapIterator<String,String> it =map.inverseBidiMap().mapIterator();//{sxt@qq.com=sxt, bj@test.com=bj}
while(it.hasNext()){
String key =it.next();
String value =it.getValue();
System.out.println(key+"-->"+value);
/*sxt@qq.com-->sxt
bj@test.com-->bj*/
}
}
} import org.apache.commons.collections4.Bag;
import org.apache.commons.collections4.bag.HashBag;
import org.apache.commons.collections4.bag.TreeBag; /**
接口Bag 包 允许重复
实现类1、HashBag 无序
实现类2、TreeBag 有序
统计单词的出现次数
*/
public class Demo08 { /**
* @param args
*/
public static void main(String[] args) {
hashBag();
treeBag();
String str ="this is a cat and that is a mice where is the food";
//分割字符串
String[] strArray =str.split(" ");
Bag<String> bag =new TreeBag<String>();
for(String temp:strArray){
bag.add(temp);//[2:a,1:and,1:cat,1:food,3:is,1:mice,1:that,1:the,1:this,1:where]
} System.out.println("====统计次数===");
Set<String> keys =bag.uniqueSet();//[a, and, cat, food, is, mice, that, the, this, where]
for(String letter:keys){
System.out.println(letter+"-->"+bag.getCount(letter));
/*a-->2
and-->1
cat-->1
food-->1
is-->3
mice-->1
that-->1
the-->1
this-->1
where-->1*/
}
}
/**
* 有序
*/
public static void treeBag(){
System.out.println("=====有序的包====");
Bag<String> bag =new TreeBag<String>();
bag.add("a");
bag.add("a",);
bag.remove("a", );
bag.add("b");
bag.add("c");//[4:a,1:b,1:c],有序
Iterator<String> it =bag.iterator();
while(it.hasNext()){
System.out.println(it.next());//aaaabc
}
} /**
* 无序
*/
public static void hashBag(){
System.out.println("=====无序的包====");
Bag<String> bag =new HashBag<String>();
bag.add("a");
bag.add("a",);//加5次a,[6:a]
bag.remove("a", );//移除2个a,[4:a]
bag.add("b");
bag.add("c");//[1:b,1:c,4:a],一个b,一个c,4个a,
Iterator<String> it =bag.iterator();
while(it.hasNext()){
System.out.println(it.next());//bcaaaa
}
} } 总结:
set没有顺序,顺序指的是索引的顺序不是指内容。
.迭代器:Iterator,
.比较器:实体类可以排序(实现Comparable重写compareTo),还可以用排序比较器(实现Comparator重写compare),TreeSet、TreeMap.
.泛型:反泛型类,泛型方法,泛型接口,泛型擦出,通配符?
.6个接口:Collection,set,List,Map,Iterator,Comparable
.9个常用类:
)
查看多余修改时推荐使用ArrayList(add,remove,set(修改),get,foreach,)。
)
修改多余查看推荐使用LinkList,多了链头与链尾的方法。 )HashSet:元素不能重复,所以要求元素要重写hashCode和equals方法.
)Treeset:要求元素可以排序或者提供排序的业务类。
)HashMap:键不能重复必须重写hashCode和equals方法,值可以重复,put(),remove(),get().
)Properties:资源配置文件,
)Hashtable:键与值都不能为null,
)Stack:栈
)Collections:工具类

java11 Guava:谷歌开发的集合库的更多相关文章

  1. iOS开发常用第三方库

    UI 动画 网络相关 Model 其他 数据库 缓存处理 PDF 图像浏览及处理 摄像照相视频音频处理 响应式框架 消息相关 版本新API的Demo 代码安全与密码 测试及调试 AppleWatch ...

  2. iOS开发中静态库制作 之.a静态库制作及使用篇

    iOS开发中静态库之".a静态库"的制作及使用篇 一.库的简介 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的类型? 根据源代码的公开情况,库可以分为2种类 ...

  3. iPhone开发 - 常用库

    iPhone开发 - 常用库 这里总结了iPhone开发者开发过程中可能需要的一些资源 如何用Facebook graphic api上传视频: http://developers.facebook. ...

  4. [Google Guava] 2.1-不可变集合

    范例 01 public static final ImmutableSet<String> COLOR_NAMES = ImmutableSet.of( 02 "red&quo ...

  5. iOS开发中静态库之".framework静态库"的制作及使用篇

    iOS开发中静态库之".framework静态库"的制作及使用篇 .framework静态库支持OC和swift .a静态库如何制作可参照上一篇: iOS开发中静态库之" ...

  6. ios 开发中 动态库 与静态库的区别

    使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库, ...

  7. 分享:写了一个 java 调用 C语言 开发的动态库的范例

    分享:写了一个 java 调用 C语言 开发的动态库的范例 cfunction.h   代码#pragma once#ifdef __cplusplusextern "C" {#e ...

  8. iOS开发之静态库(五)—— 图片、界面xib等资源文件封装到静态框架framework

    编译环境:Macbook Air + OS X 10.9.2 + XCode5.1 + iPhone5s(iOS7.0.3) 一.首先将资源文件打包成bundle 由于bundle是静态的,所以可以将 ...

  9. APICloud支持Atom编辑器,并建立开发工具核心库

    APICloud支持Atom编辑器开发工具 APICloud始终坚持多开发工具支持策略,开发者无论使用Sublime Text3.Eclipse还是Webstorm,都可以在APICloud平台中找到 ...

随机推荐

  1. [jobdu]二叉树的镜像

    树的镜像,这里的做法就是先序遍历的反过来呗. #include <iostream> #include <vector> using namespace std; void p ...

  2. SPRING IN ACTION 第4版笔记-第七章Advanced Spring MVC-002- 在xml中引用Java配置文件,声明DispatcherServlet、ContextLoaderListener

    一.所有声明都用xml 1. <?xml version="1.0" encoding="UTF-8"?> <web-app version= ...

  3. 第五章 HID设备

    5.1 HID介绍 为简化USB设备的开发过程,USB提出了设备类的概念.所有设备类都必须支持标准USB描述符和标准USB设备请求.如果有必要,设备类还可以自行定义其专用的描述符和设备请求,这分别被称 ...

  4. WPF中的MatrixTransform

    原文:WPF中的MatrixTransform WPF中的MatrixTransform                                                         ...

  5. android5.0问题

    2042-2247/system_process W/AudioTrack﹕ AUDIO_OUTPUT_FLAG_FAST denied by client libzte-ril.so has tex ...

  6. 【HDOJ】1071 The area

    数学题,先求抛物线和直线的系数,再利用积分公式求面积. #include <stdio.h> #include <math.h> int main() { double x1, ...

  7. mplayer windows configure修改

    相信大家在编译mplayer的时候,都会遇到一个问题,就是那个折腾人的mplayer会检测当面目录下有没有ffmpeg的文件夹. 没有的话,mplayer会启动git进行漫长的下载ffmpeg源码.其 ...

  8. APP-FND-01706: Error Updating TABLE_NAME In FND_DOCUMENT_SEQUENCES (文档 ID 338026.1)

    In this Document Symptoms Cause Solution Applies to: Oracle Order Management - Version 11.5.10.0 and ...

  9. iis 5.1 连接 sql 2005

    VS2005+SQL2005 ASP.NET2.0数据库连接总结 通过上篇文章(http://www.cnblogs.com/user34j/archive/2007/01/23/628426.htm ...

  10. WCF大数据量传输解决方案

    文章内容列表:1. 场景:2. 解决方案3. WCF契约与服务实现设计静态图4. WCF契约与服务实现设计详细说明6. 服务端启动服务代码:7. 客户端代码8.   WCF大数据量传输解决方案源码下载 ...