Guava

guava的新集合类型

\color{#FF7D00}{HashMultiSet}

Multiset占据了List和Set之间的一个灰色地带:允许重复,但是不保证顺序。
常见使用场景:Multiset有一个有用的功能,就是跟踪每种对象的数量,所以你可以用来进行数字统计

 @Test
    public void testMultiSet(){
        HashMultiset<String> multiSet = HashMultiset.create();
        multiSet.addAll(ImmutableList.of("Paul","Dean"));
        multiSet.add("Paul",3);
        multiSet.add("Paul");
        System.out.println(multiSet);
        System.out.println(multiSet.size());
        System.out.println(multiSet.count("Paul"));
    }

结果:
[Paul x 5, Dean]
6
5

\color{#FF7D00}{Multimap}

Multimap可以很方便的实现Map<String,List<StudentDto>> 这种结构

@Test
    public void testMultiMap(){
        Multimap<String, User> map = ArrayListMultimap.create();
        User user1 = new User("Paul",22);
        User user2 = new User("Dean",33);
        User user3 = new User("Lily",33);
        map.put("Super",user1);
        map.put("Super",user2);
        map.put("Non",user3);
        for (Map.Entry<String,User> entry : map.entries()) {
            System.out.println("key:"+entry.getKey()+"  Value:"+entry.getValue());
        }
        System.out.println(map.get("Super"));

        System.out.println("all keys: "+map.keys());
    }

\color{#FF7D00}{BiMap}

BiMap提供了一种新的集合类型,它提供了key和value的双向关联的数据结构。

 @Test
    public void testBiMap(){
        BiMap<String,Integer> map = ImmutableBiMap.of("Paul",22,"Dean",16);
        //inverse方法会返回一个反转的BiMap,但是注意这个反转的map不是新的map对象,它实现了一种视图关联,这样你对于反转后的map的所有操作都会影响原先的map对象
        LOGGER.info("通过BiMap反向获取key值:{}",map.inverse().get(22));
    }

\color{#FF7D00}{Maps}

对map的值进行操作

@Test
    public void mapTransformationValue(){
        ImmutableMap<String,Integer> map = ImmutableMap.of("a",1,"b",2,"c",3);
        Map<String,Integer> newMap = Maps.transformValues(map, v -> v+1);
        for (String key : newMap.keySet()) {
            System.out.println("key:"+key+"  Value:" + newMap.get(key));
        }
    }

\color{#FF7D00}{Lists}

对List的值进行操作

 @Test
    public void listTransformationTest(){
        List<String> strList = Lists.newArrayList("asd","wer","Jons","jean","Peter");
        List<String>  newList1 = Lists.transform(strList,s -> s.toUpperCase());
        newList1.forEach(System.out::println);

        strList.stream().map(String::toLowerCase).forEach(System.out::println);
    }

\color{#FF7D00}{Basic-Type}

//com.google.common.primitices包下的Ints,Doubles,Floats,Shorts,Bytes以及Bools
    @Test
    public void compare(){
        //返回-1,0,1
        int x = Ints.compare(1,2);
        LOGGER.info("max : {}",x);
        //包含关系
        boolean y = Doubles.contains(new double[]{1,2,3},1);
        LOGGER.info("Contains : {}",y);
        String array = Ints.join(",",1,2,3);
        LOGGER.info("join : {}" , array);
        float max = Floats.max(1,2,3,4);
        LOGGER.info("Max : {}",max);

    }


结果:
max : -1
Contains : true
join : 1,2,3
Max : 4.0

/**
     * Guava 中的String
     */
    @Test
    public void stringCommon(){
        //判断字符串为null和空
        String input = "";
        boolean isNullOrEmpty = Strings.isNullOrEmpty(input);
        System.out.println("input " + (isNullOrEmpty?"is":"is not") + " null or empty.");

        //获取字符串相同的前缀
        String a = "com.jd.coo.Hello";
        String b = "com.jd.coo.Hi";
        String ourCommonPrefix = Strings.commonPrefix(a,b);
        System.out.println("a,b common prefix is " + ourCommonPrefix);

        //获取字符串相同的后缀
        String c = "com.google.Hello";
        String d = "com.jd.Hello";
        String ourSuffix = Strings.commonSuffix(c,d);
        System.out.println("c,d common suffix is " + ourSuffix);

        //补全字符串
        int minLength = 4;
        String padEndResult = Strings.padEnd("123", minLength, '0');
        System.out.println("****************补全字符串***************");
        System.out.println("padEndResult is " + padEndResult);
        String padStartResult = Strings.padStart("1", 2, '0');
        System.out.println("padStartResult is " + padStartResult);
    }

input is null or empty.
a,b common prefix is com.jd.coo.H
c,d common suffix is .Hello
****************补全字符串***************
padEndResult is 1230
padStartResult is 01

\color{#FF7D00}{Joiner}

当出现null值时,Joiner可以很好的处理

@Test
    public void testGuavaJoiner(){
        String[] x = {"as","sad","rt4"};
        LOGGER.info("Result of Joiner : {}", Joiner.on("==").join(x));

        List<String> list = Arrays.asList("123","asd",null,"fghh");
        LOGGER.info("Result of Joiner except null: {}",Joiner.on(",").skipNulls().join(list));

        ImmutableMap<String,Integer> map = ImmutableMap.of("1",11,"2",22,"3",33);
        LOGGER.info("Result of Joiner map: {}" , Joiner.on(",").withKeyValueSeparator("=").join(map));
    }

结果:
as==sad==rt4
123,asd,fghh
1=11,2=22,3=33

\color{#FF7D00}{Splitter}

很好的字符串分割

 /**
     * Guava中的Splitter
     * on():指定分隔符来分割字符串
     * limit():当分割的子字符串达到了limit个时则停止分割
     * fixedLength():根据长度来拆分字符串
     * trimResults():去掉子串中的空格
     * omitEmptyStrings():去掉空的子串
     * withKeyValueSeparator():要分割的字符串中key和value间的分隔符,分割后的子串中key和value间的分隔符默认是=
     *
     */

    @Test
    public void splitterCommon(){
        ImmutableMap<String,Integer> map = ImmutableMap.of("1",11,"2",22,"3",33);
        String mapString = Joiner.on(",").withKeyValueSeparator("=").join(map);
        Map<String,String> map1 = Splitter.on(",").withKeyValueSeparator("=").split(mapString);
        LOGGER.info("Result of Joiner map: {}" , map1);

    }



    //Splitter类返回的是Iterator类型的接口
    @Test
    public void splitterLimit(){
        String str = "1#2#3#4#5#6#7";
        LOGGER.info("Result of split by limit:{}",Splitter.on("#").limit(3).split(str));

        String strWithSpace = "1#2##3##4###5#6";
        LOGGER.info("Result of split by limit and space(doesn't deal with space):{}",Splitter.on("#").split(strWithSpace));

        LOGGER.info("Result of split by limit and space:{}",Splitter.on("#").omitEmptyStrings().split(strWithSpace));

        Iterable iterable = Splitter.on("#").limit(3).split(str);
        Iterator iterator = iterable.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }

\color{#FF7D00}{Ordering}

对集合的一些排序、最大、最小值的处理

/**
     * Guava的比较器Ordering
     *    reverse(): 返回与当前Ordering相反的排序:
     *   nullsFirst(): 返回一个将null放在non-null元素之前的Ordering,其他的和原始的Ordering一样;
     *   nullsLast():返回一个将null放在non-null元素之后的Ordering,其他的和原始的Ordering一样;
     *   compound(Comparator):返回一个使用Comparator的Ordering,Comparator作为第二排序元素,例如对bug列表进行排序,先根据bug的级别,再根据优先级进行排序;
     *   lexicographical():返回一个按照字典元素迭代的Ordering;
     *   onResultOf(Function):将function应用在各个元素上之后, 在使用原始ordering进行排序;
     *   greatestOf(Iterable iterable, int k):返回指定的第k个可迭代的最大的元素,按照这个从最大到最小的顺序。是不稳定的。
     *   leastOf(Iterable<E> iterable,int k):返回指定的第k个可迭代的最小的元素,按照这个从最小到最大的顺序。是不稳定的。
     *   isOrdered(Iterable):是否有序,Iterable不能少于2个元素。
     *   isStrictlyOrdered(Iterable):是否严格有序。请注意,Iterable不能少于两个元素。
     *   sortedCopy(Iterable):返回指定的元素作为一个列表的排序副本。
     */
    @Test
    public void testOrdering(){
        List<String> strList = Lists.newArrayList("asd","wer","Jons","jean","Peter");
        List<String> strList2 = Lists.newArrayList("asd","wer","Jons",null,"jean","Peter");
        List<String> naturalSortedList = Ordering.natural().sortedCopy(strList);
        List<String> naturalRecersedList = Ordering.natural().reverse().sortedCopy(strList);
        List<String> nullFirstList = Ordering.natural().nullsFirst().sortedCopy(strList2);
        List<String> nullLastList = Ordering.natural().nullsLast().sortedCopy(strList2);
        System.out.println("naturalSortedList:"+naturalSortedList+"\nnaturalRecersedList:"+naturalRecersedList+"\nnullFirstList:"+
                nullFirstList+"\nnullLastList:"+nullLastList);

        List<Integer> intList = Arrays.asList(1,2,346,67,8,45,232,69);
        int min = Ordering.natural().min(intList);
        int max = Ordering.natural().max(intList);
        System.out.println("Min:"+min+"Max: "+max);

        ImmutableList<User> users = ImmutableList.of(new User("Dean",22),
                new User("Xiao",33),
                new User("Paul",25));

        List<String> userNames = Lists.transform(users, new Function<User, String>() {
            @Nullable
            @Override
            public String apply(@Nullable User user) {
                return user.getAge() > 24 ? user.getName() : "";
            }
        });

        Collection<String> collection = Collections2.filter(userNames,Predicates.isNull());
        System.out.println("transformList:"+collection);

    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,492评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,048评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,927评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,293评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,309评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,024评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,638评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,546评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,073评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,188评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,321评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,998评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,678评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,186评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,303评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,663评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,330评论 2 358

推荐阅读更多精彩内容

  • 目前Google Guava在实际应用中非常广泛,本篇博客将以博主对Guava使用的认识以及在项目中的经验来给大家...
    张丰哲阅读 15,287评论 12 184
  • 不可变集合类 为什么要使用不可变集合不可变对象有很多优点,包括: 当对象被不可信的库调用时,不可变形式是安全的;不...
    icecrea阅读 1,618评论 0 0
  • 目前Google Guava在实际应用中非常广泛,本篇博客将以博主对Guava使用的认识以及在项目中的经验来给大家...
    java高并发阅读 1,653评论 0 8
  • 九阳神功我觉得是一个比较基础的武功,能够反弹伤害(避免垃圾代码),学了它,张无忌才能驾驭其他更高级的武功。 介绍 ...
    土豆肉丝盖浇饭阅读 3,948评论 2 52
  • 我知道 不论你是不是在远方 你 从今往后 都不会在我身边了 从你 放弃我的那一刻起 只是 我却将你 永远的放在了心...
    幸福_e8c9阅读 137评论 0 0