java互联网科技程序员

优雅编程之Guava瓜娃工具类的7点整理学习分享(三十九)

2017-01-24  本文已影响1117人  架构师启示录

开心一笑

【面试官:“熟悉哪种语言”。
应聘者:“JAVA”。
面试官:“知道什么叫类么”。
应聘者:“我这人实在,工作努力,不知道什么叫累”。
面试官:“知道什么是包?”。
应聘者:“我这人实在 平常不带包 也不用公司准备了”。
面试官:“知道什么是接口吗?”。
应聘者:“我这个人工作认真。从来不找借口偷懒”。
面试官:“知道什么是继承么”。
应聘者:“我是 孤儿没什么可以继承的”。
面试官:“知道什么叫对象么?”。
应聘者:“知道,不过我工作努力,上进心强,暂时还没有打算找对象。”。
面试官:“知道多态么?”。
应聘者:“知道,我很保守的。我认为让心爱的女人为了自已一时的快乐去堕胎是不道德的行为!请问这和C#有什么关系?”】

唯美图片

提出问题

Guava扩展包对项目比较有用的知识有哪些???

解决问题

1.Guava扩展包的简单介绍

Guava,中文是石榴的意思 ,一个基于JDK1.6类库集合的扩展项目

源码包的简单说明:

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代码更加优雅,更加简洁,然后愉快的玩耍。

2.强大的Strings类

实例一:

package com.evada.de;
import com.google.common.base.Strings;
import org.junit.Test;
/**
 * @Author 阿毅
 * Created by Ay on 2016/01/21.
 */
public class Ay{
    @Test
    public void test(){
        System.out.println(Strings.isNullOrEmpty(""));//true
        System.out.println(Strings.nullToEmpty(null));//""
        System.out.println(Strings.nullToEmpty("ay"));//"ay"
        System.out.println(Strings.emptyToNull(""));//null
        System.out.println(Strings.emptyToNull("ay"));//"ay"
        System.out.println(Strings.commonPrefix("aaay", "aal"));//"aa"否则返回""
        System.out.println(Strings.commonSuffix("aaay", "aal"));//"aac"否则返回""

        String str1 = "ay.";
        //在str1后补'a'补够15个长度
        String strr1 = Strings.padEnd(str1, 15,'l');
        System.out.println(strr1);//ay.llllllllllll
        //在str2前补'a'补够10个长度
        String str2 = "welcome";
        String  strr2 = Strings.padStart(str2, 10,  'm');
        System.out.println(strr2);
    }
}

实例二:

package com.evada.de;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @Author 阿毅
 * Created by Ay on 2016/01/21.
 */
public class Ay{
    @Test
    public void test(){
        Joiner joiner = Joiner.on("; ").skipNulls();
        System.out.println(joiner.join("ay", null, "al", "love"));//ay; al; love

        List<String> joinListStr = new ArrayList<>();
        joinListStr.add("ay");
        joinListStr.add(null);
        joinListStr.add("al");
        joinListStr.add("love");
        Joiner joiner2 = Joiner.on("; ").skipNulls();
        System.out.println(joiner2.join(joinListStr));//ay; al; love
        //trimResults 和 omitEmptyStrings可以去空,去空白
        Iterable splitterArray =  Splitter.on(',').trimResults().omitEmptyStrings().split("ay,al,,   love");
        System.out.println(splitterArray.toString());//[ay, al, love]
        //传统的字符串分割
        String[] originArray = "ay,al,,   love".split(",");
        System.out.println(Arrays.toString(originArray));//[ay, al, ,    love]
        System.out.println(originArray.length);// 4(长度为)
        for(int i=0;i<originArray.length;i++){
            System.out.println(originArray[i]);
        }
//        4
//        ay
//                al
//
//        love



    }
}

连接器[Joiner] 和 拆分器[Splitter] 拆分器修饰符

方法                          描述
omitEmptyStrings()       从结果中自动忽略空字符串
trimResults()            移除结果字符串的前导空白和尾部空白
trimResults(CharMatcher) 给定匹配器,移除结果字符串的前导匹配字符和尾部匹配字符
limit(int)               限制拆分出的字符串数量

如果想要拆分器返回List,只要使用Lists.newArrayList(splitter.split(string))或类似方法。

splitter实例总是不可变的。用来定义splitter目标语义的配置方法总会返回一个新的splitter实例。这使得splitter实例都是线程安全的,你可以将其定义为static final常量。

我们看看源码就清楚了:

public static Splitter on(final CharMatcher separatorMatcher) {
    Preconditions.checkNotNull(separatorMatcher);
    //新的splitter实例
    return new Splitter(new Splitter.Strategy() {
        public Splitter.SplittingIterator iterator(final Splitter splitter, final CharSequence toSplit) {
            return new Splitter.SplittingIterator(splitter, toSplit) {
                int separatorStart(int start) {
                    return separatorMatcher.indexIn(this.toSplit, start);
                }

                int separatorEnd(int separatorPosition) {
                    return separatorPosition + 1;
                }
            };
        }
    });
}

3.强大的集合工具类

3.1集合实例化

package com.evada.de;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import org.junit.Test;

import java.util.*;

/**
 * @Author 阿毅
 * Created by Ay on 2016/01/21.
 */
public class Ay{
    @Test
    public void test(){
        //传统的
        List<String> list = new ArrayList<String>();
        //Gvava瓜娃写法
        List<String> list2 = Lists.newArrayList();
        Map<String, String> map = Maps.newLinkedHashMap();
        //这个构造方法非常实用
        List<String> list3 = Lists.newArrayList("ay", "and", "al");
        //指定容器的大小
        List<String> exactly100 = Lists.newArrayListWithCapacity(100);
        List<String> approx100 = Lists.newArrayListWithExpectedSize(100);
        Set<String> approx100Set = Sets.newHashSetWithExpectedSize(100);
    }
}

更多的内容可以参考官方API

3.2 Iterables

package com.evada.de;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import org.junit.Test;

import java.util.*;

/**
 * @Author 阿毅
 * Created by Ay on 2016/01/21.
 */
public class Ay{
    @Test
    public void test(){
        List<String> list3 = Lists.newArrayList("ay", "and", "al");
        //好用
        Iterable<String> concatenated = Iterables.concat(list3);
        String lastAdded = Iterables.getLast(concatenated);
        System.out.println(lastAdded);//al
    }
}

Guava还提供了很多其他集合的好用方法,这里只是简单的罗列出比较有用的,更多内容可以百度上搜索。

3.3不可变集合与使用不可变集合

不可变集合优点:

不可变集合可以用如下多种方式创建:

public static final ImmutableSet<Color> GOOGLE_COLORS =
ImmutableSet.<Color>builder()
    .addAll(WEBSAFE_COLORS)
    .add(new Color(0, 191, 255))
    .build();

此外,对有序不可变集合来说,排序是在构造集合的时候完成的,如:

ImmutableSortedSet.of("a", "b", "c", "a", "d", "b");

会在构造时就把元素排序为a, b, c, d。

4.好用的Object方法

Objects.equal("a", "a"); // returns true
Objects.equal(null, "a"); // returns false
Objects.equal("a", null); // returns false
Objects.equal(null, null); // returns true

在前面的文章《Java之项目用到类Objects,TreeMap排序简单分享》,有提到,可以去阅读

5.Guava I/O流

6.Guava新集合类型

7.Guava并发

上面的内容可以自学,网上资料还是很多的。

读书感悟

来自键人(林育圣)《负负得正的人生奥义书》

经典故事

【加拿大有一个印第安人的部落,冬天过后,他们点起篝火,将所有过冬的帐篷,用具付之一炬,重修开始四处渔猎的生活。启发:学会忘掉过去,推翻过去自己,重新开始】

大神文章

【1】Guava学习笔记:Google Guava 类库简介
【2】Java代码优雅之道-Guava
【3】强大的GUAVA之Strings
【4】[Guava学习笔记]Strings: 字符串处理
【5】[Google Guava] 6-字符串处理:分割,连接,填充
【6】[Google Guava] 2.3-强大的集合工具类:java.util.Collections中未包含的集合工具
【7】[Google Guava] 2.1-不可变集合

其他

如果有带给你一丝丝小快乐,就让快乐继续传递下去,欢迎点赞、顶、欢迎留下宝贵的意见、多谢支持!

上一篇 下一篇

猜你喜欢

热点阅读