zoukankan      html  css  js  c++  java
  • java11 Guava:谷歌开发的集合库

    Guava:谷歌开发的集合库,通过build path->Add External JARs 把guava.jar包加进去。
    
    版本控制工具:1.CVS 2.SVN 3.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()>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 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()>=5 && element.length()<=20);
                    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(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 temp:intersection){
                System.out.println(temp);//3456
            }
            //差集
            System.out.println("差集为:");
            SetView<Integer> diff =Sets.difference(sets, sets2);
            for(Integer temp:diff){
                System.out.println(temp);//12
            }
            //并集
            System.out.println("并集为:");
            SetView<Integer> union =Sets.union(sets, sets2);
            for(Integer temp:union){
                System.out.println(temp);//123456789
            }
        }
    }
    
    
    
    
    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", 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> temp:cells){
                System.out.println(temp.getRowKey()+"-->"+temp.getColumnKey()+"-->"+temp.getValue());
            }
            
            System.out.println("==========学生查看成绩==============");
            System.out.print("学生	");
            //所有的课程
            Set<String> cours =tables.columnKeySet();
            for(String t:cours){
                System.out.print(t+"	");
            }
            System.out.println();
            //所有的学生
            Set<String> stus =tables.rowKeySet();
            for(String stu:stus){
                System.out.print(stu+"	");
                Map<String,Integer> scores =tables.row(stu);
                for(String c:cours){
                    System.out.print(scores.get(c)+"	");
                }
                System.out.println();
            }
            
            System.out.println("==========课程查看成绩==============");
            System.out.print("课程	");
            //所有的学生
            Set<String> stuSet =tables.rowKeySet();
            for(String t:stuSet){
                System.out.print(t+"	");
            }
            System.out.println();
            //所有的课程
            Set<String> courSet =tables.columnKeySet();
            for(String c:courSet){
                System.out.print(c+"	");
                Map<String,Integer> scores =tables.column(c);
                for(String s:stuSet){
                    System.out.print(scores.get(s)+"	");
                }
                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()>=5 && object.length()<=20;
                }};
            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()<10000;
                }
            };
            Predicate<Employee> isHigh=new Predicate<Employee>(){//匿名内部类
                @Override
                public boolean evaluate(Employee emp) {
                    return emp.getSalary()>=10000;
                }
            };
            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("老马",1000000));
            list.add(new Employee("老裴",999));
            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",120,true));
            goodsList.add(new Goods("javaee视频2",100,false));
            goodsList.add(new Goods("高新技术视频",80,false));
                    
            //满百减20
            Closure<Goods> subtract=new Closure<Goods>(){
                public void execute(Goods goods) {
                    if(goods.getPrice()>=100){
                        goods.setPrice(goods.getPrice()-20);
                    }
                }};
            //打折
            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",20000));
            empList.add(new Employee("is",10000));
            empList.add(new Employee("good",5000));
            
            //业务功能 每次上涨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()<10000;
                }            
            };    
            //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",120,true));
            goodsList.add(new Goods("javaee视频2",100,false));
            goodsList.add(new Goods("高新技术视频",80,false));
                    
            //满百减20
            Closure<Goods> subtract=new Closure<Goods>(){
                public void execute(Goods goods) {
                    if(goods.getPrice()>=100){
                        goods.setPrice(goods.getPrice()-20);
                    }
                }};
            //打折
            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",20000));
            empList.add(new Employee("is",10000));
            empList.add(new Employee("good",5000));
            
            //业务功能
            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(1);
            set1.add(2);
            set1.add(3);
            
            Set<Integer> set2 =new HashSet<Integer>();
            set2.add(2);
            set2.add(3);
            set2.add(4);
            
            //并集
            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>(2);
            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>(2);
            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>(2);
            que.add("a");
            que.add("b");
            que.add("c");
            //查看
            for(int i=0;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 ={1,2,3,4,5};
            //数组迭代器
            Iterator<Integer> it0 =new ArrayListIterator<Integer>(arr);
            //指定起始索引和结束索引
            Iterator<Integer> it =new ArrayListIterator<Integer>(arr,1,3);
            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=0;i<8;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",5);
            bag.remove("a", 2);
            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);//加5次a,[6:a]
            bag.remove("a", 2);//移除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没有顺序,顺序指的是索引的顺序不是指内容。
    1.迭代器:Iterator,
    2.比较器:实体类可以排序(实现Comparable重写compareTo),还可以用排序比较器(实现Comparator重写compare),TreeSet、TreeMap.
    3.泛型:反泛型类,泛型方法,泛型接口,泛型擦出,通配符?
    4.6个接口:Collection,set,List,Map,Iterator,Comparable
    5.9个常用类:
    1)
    查看多余修改时推荐使用ArrayList(add,remove,set(修改),get,foreach,)。
    2)
    修改多余查看推荐使用LinkList,多了链头与链尾的方法。
    
    3)HashSet:元素不能重复,所以要求元素要重写hashCode和equals方法.
    4)Treeset:要求元素可以排序或者提供排序的业务类。
    5)HashMap:键不能重复必须重写hashCode和equals方法,值可以重复,put(),remove(),get().
    6)Properties:资源配置文件,
    7)Hashtable:键与值都不能为null,
    8)Stack:栈
    9)Collections:工具类
  • 相关阅读:
    TestNg JAVA 自动化单元测试框架Demo
    Python Unittest 自动化单元测试框架Demo
    Mac 安装工具包brew
    Mac 终端提示You have not agreed to the Xcode license agreements
    查看 ios 真机调试log,导出log
    Python WxPython 的安装以及使用
    RTMP协议抓包详解
    流媒体协议地址获取 rtmp
    手游-放开那三国socket协议分析
    jquery.tochart.js
  • 原文地址:https://www.cnblogs.com/yaowen/p/4833576.html
Copyright © 2011-2022 走看看