Guava API

本文介绍了Java中字符串处理的方法,包括字符串连接、拆分、匹配等操作,并详细讲解了Guava库中Joiner和Splitter类的使用。此外,还探讨了多种集合类型的应用场景,如不可变集合、可重复集合、MultiMap和BiMap的特点及操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、字符串的处理

  字符串的连接&拆分&匹配及常用操作

  Joiner&Splitter

 1     @Test
 2     public void testJoiner() {
 3         String[] strs = new String[]{"pan",null,"teng"};
 4         //由于字符串中含有null  因此会抛出异常,需要调用以下方法
 5         //Joiner joiner = Joiner.on("-").skipNulls();    //跳过 null
 6         Joiner joiner = Joiner.on("-").useForNull("空");    //将null用“空” 替换
 7         //joiner.skipNulls();    这样调用是不行的,不会改变 joiner,需要将skipNulls 返回值赋给joiner才行
 8         String joinStr = joiner.join(strs[0], strs[1], strs[2]);
 9         System.out.println("joinStr = " + joinStr);
10         //joiner 还可以连接对象,这种情况下 会调用对象的toString方法,将对象转换为String
11     }
Joiner
/* CharMatcher 默认常量实现类:
         * ANY: 匹配任何字符
         * ASCII: 匹配是否是ASCII字符
         * BREAKING_WHITESPACE: 匹配所有可换行的空白字符(不包括非换行空白字符,例如"\u00a0")
         * DIGIT: 匹配ASCII数字 
         * INVISIBLE: 匹配所有看不见的字符
         * JAVA_DIGIT: 匹配UNICODE数字, 使用 Character.isDigit() 实现
         * JAVA_ISO_CONTROL: 匹配ISO控制字符, 使用 Charater.isISOControl() 实现
         * JAVA_LETTER: 匹配字母, 使用 Charater.isLetter() 实现
         * JAVA_LETTER_OR_DIGET: 匹配数字或字母
         * JAVA_LOWER_CASE: 匹配小写
         * JAVA_UPPER_CASE: 匹配大写
         * NONE: 不匹配所有字符
         * SINGLE_WIDTH: 匹配单字宽字符, 如中文字就是双字宽
         * WHITESPACE: 匹配所有空白字符
         * 
         * 常用操作方法:
         * 修剪[trim]、折叠[collapse]、移除[remove]、保留[retain]
         * CharMatcher is(char match): 返回匹配指定字符的Matcher
         * CharMatcher isNot(char match): 返回不匹配指定字符的Matcher
         * CharMatcher anyOf(CharSequence sequence): 返回匹配sequence中任意字符的Matcher
         * CharMatcher noneOf(CharSequence sequence): 返回不匹配sequence中任何一个字符的Matcher
         * CharMatcher inRange(char startInclusive, char endIncludesive): 返回匹配范围内任意字符的Matcher
         * CharMatcher forPredicate(Predicate<? super Charater> predicate): 返回使用predicate的apply()判断匹配的Matcher
         * CharMatcher negate(): 返回以当前Matcher判断规则相反的Matcher
         * CharMatcher and(CharMatcher other): 返回与other匹配条件组合做与来判断的Matcher
         * CharMatcher or(CharMatcher other): 返回与other匹配条件组合做或来判断的Matcher
         * boolean matchesAnyOf(CharSequence sequence): 只要sequence中有任意字符能匹配Matcher,返回true
         * boolean matchesAllOf(CharSequence sequence): sequence中所有字符都能匹配Matcher,返回true
         * boolean matchesNoneOf(CharSequence sequence): sequence中所有字符都不能匹配Matcher,返回true
         * int indexIn(CharSequence sequence): 返回sequence中匹配到的第一个字符的坐标
         * int indexIn(CharSequence sequence, int start): 返回从start开始,在sequence中匹配到的第一个字符的坐标
         * int lastIndexIn(CharSequence sequence): 返回sequence中最后一次匹配到的字符的坐标
         * int countIn(CharSequence sequence): 返回sequence中匹配到的字符计数
         * String removeFrom(CharSequence sequence): 删除sequence中匹配到到的字符并返回
         * String retainFrom(CharSequence sequence): 保留sequence中匹配到的字符并返回
         * String replaceFrom(CharSequence sequence, char replacement): 替换sequence中匹配到的字符并返回
         * String trimFrom(CharSequence sequence): 删除首尾匹配到的字符并返回
         * String trimLeadingFrom(CharSequence sequence): 删除首部匹配到的字符
         * String trimTrailingFrom(CharSequence sequence): 删除尾部匹配到的字符
         * String collapseFrom(CharSequence sequence, char replacement): 将匹配到的组(连续匹配的字符)替换成replacement 
         * String trimAndCollapseFrom(CharSequence sequence, char replacement): 先trim在replace
         * */
匹配器及常用方法
@Test
    public void testSplitter(){
        String str = ",b,c,d,,f,";
        //JDK会自动丢掉最后一个分隔符 且 中间的无论是什么,都作为一个元素 放到数组中
        String[] strs = str.split(",");
        for(String s:strs){
            System.out.println("JDK-split:" + s + "-");
        }
        System.out.println("----------------------------");
        //Guava 提供了更多的可供选择的模式
        Iterable<String> iterable = Splitter.on(",")
                .trimResults()        //去除元素中的前导空格和后导空格
                .omitEmptyStrings()    //省略空字符串
                .limit(3)            //限制拆分元素的数量 前 n-1个正常拆分,最后的全部的作为1个元素,共拆出n个元素
                .split(str);
        Iterator<String> iterator = iterable.iterator();
        while (iterator.hasNext()) {
            System.out.print(iterator.next() + "-" );
            System.out.println();
        }
        //正则表达式匹配拆分
        System.out.println("--------------正则表达式--------------");
        String patternStr = "abc12def34ffg78jip";
        Iterable<String> iterable2 = Splitter.onPattern("[0-9]").split(patternStr);
        Iterator<String> iterator2 = iterable2.iterator();
        while (iterator2.hasNext()) {
            System.out.print(iterator2.next() + "&" );
        }
        System.out.println();
        System.out.println("----------------------------");
        //拆分器返回List
        ArrayList<String> list = Lists.newArrayList(
                iterable);
        System.out.println(list.get(0) + "-" + list.get(1));
        //数字匹配器
        String matchStr = "ab12c*(3de45你好jio:潘腾jA@#B6%7fC^&";
        System.out.println("保留数字:" + CharMatcher.DIGIT.retainFrom(matchStr));//保留所有数字
        System.out.println("去除数字:" + CharMatcher.DIGIT.removeFrom(matchStr));
        System.out.println("数字替换:" + CharMatcher.DIGIT.replaceFrom(matchStr,"*"));
        //大写字母匹配器
        System.out.println("获取所有大写字母:" + CharMatcher.JAVA_UPPER_CASE.retainFrom(matchStr));
        //单字节匹配器(汉字是双字节)
        System.out.println("去除单字节,获取双字节:" + CharMatcher.SINGLE_WIDTH.removeFrom(matchStr));
拆分 + 匹配器示例程序

 

2、集合

  不可变集合:优点-线程安全,不需要考虑变化,节省空间和时间,效率高

   注意:不可变集合不允许有null对象

/**
     * 测试不可变集合
     * @method: testImmutableSet() -by fjt
     * @TODO:   void
     */
    @Test
    public void testImmutableSet(){
        List<String> list = new ArrayList<String>(Arrays.asList("black","white","red","blue"));
        Map<String, String> map = new TreeMap<>();
        map.put("id", "20111907");
        map.put("name", "panteng");
        //创建的三种方式copyOf  of  Builder方法
        //ImmutableList<String> finalList = ImmutableList.copyOf(list);
        ImmutableList<String> finalList = ImmutableList.of("black","white","red","blue");//括号内写 list变量 会报错
        try{
            //finalList.add("yellow");    //抛出空指针异常
            //finalList.remove(0);        //抛出空指针异常
        }catch(Exception ex){
            System.out.println("List 异常信息:" + ex.getMessage());
        }
        
        ImmutableMap<String, String> finalMap = ImmutableMap.copyOf(map);
        try{
            System.out.println(finalMap.get("name"));
            finalMap.put("aa", "abcd");    //报异常
        }catch(Exception ex){
            System.out.println("Map 异常信息:" + ex.getMessage());
        }
        /** 不可变集合类型
         * ImmutableCollection
         * ImmutableList
         * ImmutableSet
         * ImmutableSortedSet
         * ImmutableMap
         * ImmutableSortedMap
         * ImmutableMultiset
         * ImmutableSortedMultiset
         * ImmutableMultimap
         * ImmutableListMultimap
         * ImmutableSetMultimap
         * ImmutableBiMap
         * ImmutableClassToInstanceMap
         * ImmutableTable
         */
    }
不可变集合

  可重复元素的集合,可以将元素看为key,value为出现次数,用于统计。

 1 /**
 2      * 1. 可以将MultiSet看成map, 作为计数器,key 为元素,值为计数器
 3      * 2. 
 4      */
 5     @Test
 6     public void testMultiSet(){
 7         Multiset<String> multisets = HashMultiset.create();
 8         String[] strArray = new String[]{"one","one","two","three"};
 9         
10         //添加元素
11         multisets.addAll(Arrays.asList(strArray));
12         multisets.add("four");
13         
14         //添加指定个数的元素
15         multisets.add("five", 3);
16         //[two, five x 3, one x 2, three, four]
17         System.out.println("打印multiset:" + multisets);
18         //返回元素总个数
19         System.out.println("元素总个数:" + multisets.size());
20         
21         //遍历
22         Iterator<String> iterator = multisets.iterator();
23         //two,five,five,five,one,one,three,four,
24         while(iterator.hasNext()){
25             System.out.print(iterator.next() + ",");
26         }
27         System.out.println();
28         Set<Entry<String>> entitySet = multisets.entrySet();//?????
29         System.out.println("???" + entitySet);
30         
31         //返回给定元素的个数
32         System.out.println("返回指定元素的重复次数:" + multisets.count("one"));
33         
34         //移除某元素的一个
35         multisets.remove("one");
36         System.out.println("移除后:" + multisets.count("one"));
37         //移除某元素的所有
38         multisets.setCount("one",0);
39         System.out.println("移除one所有后:" + multisets);
40         
41         //将不同元素放入一个Set
42         Set<String> uniqueSet = multisets.elementSet();
43         System.out.println("不同元素放入一个SET:" + uniqueSet);
44         
45         //设定一个元素的重复次数
46         multisets.setCount("three", 3);
47         System.out.println("打印multiset:" + multisets);
48     
49     }
可重复集合

   MultiMap - 一个key可以对应多个值,可以认为是一个key对应一个集合,解决一对多的问题

 1 @Test
 2     /**
 3      * ArrayListMultimap
 4         HashMultimap
 5         LinkedListMultimap*
 6         LinkedHashMultimap**
 7         TreeMultimap
 8         ImmutableListMultimap
 9         ImmutableSetMultimap
10      */
11     public void testMultiMap(){
12         Multimap<String, String> mutimap = HashMultimap.create();
13         mutimap.put("father_a", "son_a1");
14         mutimap.put("father_a", "son_a2");
15         mutimap.put("father_a", "son_a3");
16         
17         mutimap.put("father_b", "son_b1");
18         mutimap.put("father_b", "son_b2");
19         mutimap.put("father_b", "son_b3");
20         
21         //{father_a=[son_a1, son_a3, son_a2], father_b=[son_b3, son_b2, son_b1]}
22         System.out.println("mutimap = " + mutimap);
23         
24         //整体添加
25         ArrayList<String> father_c = new ArrayList<String>();
26         father_c.add("son_C1");
27         father_c.add("son_C2");
28         mutimap.putAll("father_c", father_c);
29         
30         //获取某个key对应的元素
31         Collection<String> father_a = mutimap.get("father_c");
32         Iterator<String> iterator = father_a.iterator();
33         while (iterator.hasNext()) {
34             System.out.print(iterator.next() + ",");
35         }
36         System.out.println();
37         
38         //获取键值
39         System.out.println("获取所有的键值:" + mutimap.keySet());
40         
41         //
42     }
一对多

   双向Map,即可以通过key获取value  也可以很容易的通过value获取key  实现一对一的关系;需要注意的是,必须保证值是唯一的

 1 /**
 2      * 实际上是调用反转方法 获取到一个新的Map
 3      */
 4     @Test
 5     public void testBiMap(){
 6         Map<String, String> genMap = new HashMap<String, String>();
 7         genMap.put("one", "1");
 8         genMap.put("two", "2");
 9         genMap.put("three", "3");
10         BiMap<String, String> twoDirectMap = HashBiMap.create();
11         twoDirectMap.putAll(genMap);
12         System.out.println("one = " + twoDirectMap.get("one"));
13         System.out.println("1 = " + twoDirectMap.get("1"));
14         
15         //获取反转Map
16         BiMap<String, String> twoDirectMap_mirror = twoDirectMap.inverse();
17         System.out.println("one = " + twoDirectMap_mirror.get("one"));
18         System.out.println("1 = " + twoDirectMap_mirror.get("1"));
19         
20     }
双向Map

 

转载于:https://www.cnblogs.com/tengpan-cn/p/5752068.html

Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, 等等. 这些高质量的 API 可以使你的JAVa代码更加优雅,更加简洁,让你工作更加轻松愉悦。下面我们就开启优雅Java编程学习之旅!   项目相关信息:   官方首页:http://code.google.com/p/guava-libraries   官方下载:http://code.google.com/p/guava-libraries/downloads/list   官方文档:http://docs.guava-libraries.googlecode.com/git/javadoc http://www.ostools.net/apidocs/apidoc?api=guava   源码包的简单说明:   com.google.common.annotations:普通注解类型。   com.google.common.base:基本工具类库和接口。   com.google.common.cache:缓存工具包,非常简单易用且功能强大的JVM内缓存。   com.google.common.collect:带泛型的集合接口扩展和实现,以及工具类,这里你会发现很多好玩的集合。   com.google.common.eventbus:发布订阅风格的事件总线。   com.google.common.hash: 哈希工具包。   com.google.common.io:I/O工具包。   com.google.common.math:原始算术类型和超大数的运算工具包。   com.google.common.net:网络工具包。   com.google.common.primitives:八种原始类型和无符号类型的静态工具包。   com.google.common.reflect:反射工具包。   com.google.common.util.concurrent:多线程工具包。   类库使用手册:   一. 基本工具类:让使用Java语言更令人愉悦。   1. 使用和避免 null:null 有语言歧义, 会产生令人费解的错误, 反正他总是让人不爽。很多 Guava 的工具类在遇到 null 时会直接拒绝或出错,而不是默默地接受他们。   2. 前提条件:更容易的对你的方法进行前提条件的测试。   3. 常见的对象方法: 简化了Object常用方法的实现, 如 hashCode() 和 toString()。   4. 排序: Guava 强大的 "fluent Comparator"比较器, 提供多关键字排序。   5. Throwable类: 简化了异常检查和错误传播。   二. 集合类:集合类库是 Guava 对 JDK 集合类的扩展, 这是 Guava 项目最完善和为人所知的部分。   1. Immutable collections(不变的集合): 防御性编程, 不可修改的集合,并且提高了效率。   2. New collection types(新集合类型):JDK collections 没有的一些集合类型,主要有:multisets,multimaps,tables, bidirectional maps等等   3. Powerful collection utilities(强大的集合工具类): java.util.Collections 中未包含的常用操作工具类   4. Extension utilities(扩展工具类): 给 Collection 对象添加一个装饰器? 实现迭代器? 我们可以更容易使用这些方法。   三. 缓存: 本地缓存,可以很方便的操作缓存对象,并且支持各种缓存失效行为模式。   四. Functional idioms(函数式): 简洁, Guava实现了Java的函数式编程,可以显著简化代码。   五. Concurrency(并发):强大,简单的抽象,让我们更容易实现简单正确的并发性代码。   1. ListenableFuture(可监听的Future): Futures,用于异步完成的回调。   2. Service: 控制事件的启动和关闭,为你管理复杂的状态逻辑。   六. Strings: 一个非常非常有用的字符串工具类: 提供 splitting,joining, padding
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值