一、前言
Google Guava 是 Java 通用库的开源集合,主要由 Google 工程师开发。 Google 有许多 Java 项目。 Guava 是解决那些项目中遇到的许多常见问题的解决方案,其中包括集合,数学,函数习语,输入&输出和字符串等领域。
二、字符串处理之Joiner和Splitter
1.引入依赖
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>16.0.1</version>
</dependency>
2.示例代码
package com.example.springbootdemo.test;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
public class SplitDemo {
//连接器
private static final Joiner joiner = Joiner.on(",").skipNulls();
//分割器
private static final Splitter splitter = Splitter.on(",").trimResults().omitEmptyStrings();
public static void main(String[] args) {
String join = joiner.join(Lists.newArrayList("a", null, "b", " ", "c"));
System.out.println(join);
for (String temp : splitter.split(" a, ,b,,")) {
System.out.println("|" + temp + "|");
}
}
}
3.测试结果
Joiner是连接器,Splitter是分割器,skipNulls()过滤掉null元素。
三、对基本类型进行支持
guava对JDK提供的原生类型操作进行了扩展,使得功能更加强大!
1.示例代码
package com.example.springbootdemo.test;
import com.google.common.primitives.Ints;
import java.util.Arrays;
import java.util.List;
public class GuavaDemo {
public static void main(String[] args) {
List<Integer> list = Ints.asList(1, 3, 5, 7, 9);
System.out.println(Ints.join(",", 1, 2, 3, 4));
//多个数组快速合并
int[] newIntArray = Ints.concat(new int[]{1, 2}, new int[]{3, 4, 5});
System.out.println(newIntArray.length);
//获取最大值和最小值
System.out.println("最大值:" + Ints.max(newIntArray));
System.out.println("最小值:" + Ints.min(newIntArray));
//是否包含某个元素
System.out.println(Ints.contains(newIntArray, 8));
//集合到数组的转换
int[] array = Ints.toArray(list);
System.out.println(Arrays.toString(array));
}
}
2.测试结果
guava提供了Bytes/Shorts/Ints/Iongs/Floats/Doubles/Chars/Booleans这些基本数据类型的扩展支持,只有你想不到的,没有它没有的!
四、函数式编程Functions、Predicate
我们可以使用函数式编程的方式提供自定义的Function操作。
Functions
1.示例代码
package com.example.springbootdemo.test;
import com.google.common.base.Function;
import com.google.common.base.Functions;
import com.google.common.collect.Collections2;
import com.google.common.collect.Lists;
import java.util.Collection;
import java.util.List;
public class FunctionsDemo {
public static void main(String[] args) {
List<String> list = Lists.newArrayList("a", "b", "c", "d");
Function<String, String> f1 = s -> s.length() <= 5 ? s : s.substring(0, 5);
Function<String, String> f2 = String::toUpperCase;
Function<String, String> f3 = Functions.compose(f1, f2);
Collection<String> collection = Collections2.transform(list, f3);
for (String tmp : collection) {
System.out.println(tmp);
}
}
}
2.测试结果
Predicate
Predicate最常用的功能就是运用在集合的过滤当中!
1.示例代码
package com.example.springbootdemo.test;
import com.google.common.collect.Collections2;
import com.google.common.collect.Lists;
import java.util.Collection;
import java.util.List;
public class PredicateDemo {
public static void main(String[] args) {
List<String> list = Lists.newArrayList("aa", "bb", "cc", "dd");
Collection<String> collection = Collections2.filter(list, s -> new StringBuilder(s).length() > 1);
for (String s : collection) {
System.out.println(s);
}
}
}
2.测试结果
五、异步回调
1.示例代码
package com.example.springbootdemo.test;
import com.google.common.util.concurrent.*;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class FutureDemo {
public static void main(String[] args) {
//JDK所提供的线程池
ExecutorService executorService = Executors.newFixedThreadPool(3);
//封装带有接听回调功能的线程池
ListeningExecutorService listeningExecutorService = MoreExecutors.listeningDecorator(executorService);
ListenableFuture<Integer> listenableFuture = listeningExecutorService.submit(() -> {
if (new Random().nextInt(3) == 2) {
throw new NullPointerException();
}
return 1;
});
FutureCallback futureCallback = new FutureCallback() {
@Override
public void onSuccess(Object o) {
System.out.println("---------" + o);
}
@Override
public void onFailure(Throwable throwable) {
System.out.println(throwable.getMessage());
}
};
Futures.addCallback(listenableFuture, futureCallback);
}
}
2.执行结果
我们可以通过guava对JDK提供的线程池进行装饰,让其具有异步回调监听功能,然后在设置监听器即可!