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

时间:2021-04-11 20:49:02

开心一笑

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

视频教程

大家好,我录制的视频《Java之优雅编程之道》已经在CSDN学院发布了,有兴趣的同学可以购买观看,相信大家一定会收获到很多知识的。谢谢大家的支持……

视频地址:http://edu.csdn.net/lecturer/994

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

提出问题

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不可变集合与使用不可变集合

不可变集合优点:

  • 当对象被不可信的库调用时,不可变形式是安全的;
  • 不可变对象被多个线程调用时,不存在竞态条件问题
  • 不可变集合不需要考虑变化,因此可以节省时间和空间。所有不可变的集合都比它们的可变形式有更好的内存利用率(分析和测试细节);
  • 不可变对象因为有固定不变,可以作为常量来安全使用。

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

  • copyOf方法,如ImmutableSet.copyOf(set);
  • of方法,如ImmutableSet.of(“a”, “b”, “c”)或ImmutableMap.of(“a”, 1, “b”, 2);
  • Builder工具,如

    public static final ImmutableSet GOOGLE_COLORS =
    ImmutableSet.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-不可变集合

其他

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