com.google.guava工具(1)
来源:互联网 发布:手机淘宝可以开店铺吗 编辑:程序博客网 时间:2024/05/29 09:12
最近花了点时间看了下com.google.guava里面的Guava的API,感觉有些确实比common有些工具好用,也简便。对于里面常用的工具做一个笔记方便以后自己查看(后面会继续)
package cn.gov.zcy.admin;import com.google.common.base.Function;import com.google.common.base.Optional;import com.google.common.collect.*;import com.google.common.primitives.Ints;import com.sun.istack.internal.Nullable;import org.joda.time.format.DateTimeFormat;import org.joda.time.format.DateTimeFormatter;import java.util.*;import static com.google.common.base.Preconditions.*;import static jdk.nashorn.internal.objects.NativeMath.log;/** * Created by shiwenxue on 16/7/13. */public class GuavaTest { private static final DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"); /** * Optional傻瓜式防护类 */ public void optionalTest() { // 创建指定引用的Optional实例,若引用为null则快速失败 Optional<Integer> possible1 = Optional.of(5); // 创建指定引用的Optional实例,若引用为null则表示缺失 Optional<Integer> possible = Optional.fromNullable(5); // 判断引用是否缺失 boolean present = possible.isPresent(); // 返回Optional所包含的引用,若引用缺失,则抛出java.lang.IllegalStateException Integer num3 = possible.get(); // or:若引用缺失,返回or(T)中的T,否则返回引用对象 Integer num2 = possible.or(6); // orNull:若引用缺失,返回or(T)中的T,否则返回引用对象 Integer num = possible.orNull(); // 返回Optional所包含引用的单例不可变集,如果引用存在,返回一个只有单一元素的集合,如果引用缺失,返回一个空集合。 Set<Integer> set = possible.asSet(); System.out.println(set.size()); System.out.println(num2); } /** * check 静态检查函数 */ public void checkArgTest() { try { String str1 = "sss"; String str2 = null; // 检查参数 checkArgument(!"".equals(str1), "str is empty"); // 用来检查对象是否null。 checkNotNull(str2, "str is null"); // 用来检查对象的某些状态。 checkState(!"".equals(str1)); // 检查指针是否越界 // checkElementIndex(int index, int size) // 检查[start, end]表示的位置范围对某个列表、字符串或数组是否有效* // checkPositionIndexes(int start, int end, int size) } catch (Exception e) { e.printStackTrace(); } } /** * ComparisonChain 比较链 */ public int compareTo(A a1, A a2) { return ComparisonChain.start() .compare(a1.getGender(), a2.getGender()) .compare(a1.getName(), a2.getName()) .result(); } /** * Ordering 排序器 */ public void orderTest(List<A> aList) { // 多重排序组合,从后往前;按照age倒序 Ordering<A> ordering = Ordering.natural().nullsFirst().onResultOf(new Function<A, Integer>() { public Integer apply(A a) { return a.getAge(); } }); // 字符串长度排序:倒序 Ordering<String> byLengthOrdering = new Ordering<String>() { public int compare(String left, String right) { return Ints.compare(left.length(), right.length()); } }; // 字符串长度排序-->取名字排序 Ordering<A> byLengthOrdering2 = new Ordering<A>() { public int compare(A left, A right) { return Ints.compare(left.getName().length(), right.getName().length()); } }; // 获取排序结果 List<A> result = byLengthOrdering2.greatestOf(aList.iterator(), aList.size()); // 获取排序后的前2个结果 List<A> result2 = ordering.greatestOf(aList.iterator(), 2); // 返回排序结果最小的那个(按名字) A aa = byLengthOrdering2.min(aList.iterator()); // 判断是否准确排序 // boolean is = ordering.isOrdered((Iterable<A>) aList.iterator()); } /** * ImmutableList:不可变集合 */ public void immutableCollectionTest() { List<String> temp = new ArrayList<>(); temp.add("m"); temp.add("n"); // 获取不可变集合,下面三种效果相似 List<String> list = ImmutableList.<String>builder().addAll(temp).build(); List<String> list2 = ImmutableList.copyOf(temp); List<String> list3 = ImmutableList.of("a", "b"); // 若在执行下面操作不允许 // list3.add("c"); } /** * 新型集合扩展 */ public void collectionTest() { // 1. Multiset:可以添加相同元素,提供count计数方案 Multiset<String> mutiSet = HashMultiset.create(); mutiSet.add("swx"); mutiSet.add("swx1"); mutiSet.add("swx2"); mutiSet.add("swx1"); mutiSet.add("swx3", 5); mutiSet.setCount("swx4", 5); // count(T):计数 int count = mutiSet.count("swx5"); // elementSet():返回不重复的元素 Set<String> set = mutiSet.elementSet(); // 2.Multimap:一key对多value Multimap<String, String> multiMap = HashMultimap.create(); multiMap.put("key1", "key1"); multiMap.put("key1", "key11"); multiMap.put("key1", "key111"); multiMap.put("key2", "key2"); // asMap():返回Map<K,Collection<V>>形式的视图 Map<String, Collection<String>> mmap = multiMap.asMap(); // keySet():返回不同的key Set<String> keySet = multiMap.keySet(); // keys():用Multiset表示Multimap中的所有键,每个键重复出现的次数等于它映射的值的个数 Multiset<String> keyMutiliSet = multiMap.keys(); // values():用一个”扁平”的Collection<V>包含Multimap中的所有值 Collection<String> values = multiMap.values(); // 移除操作 multiMap.remove("key1", "key1"); multiMap.removeAll("key1"); // 3.BiMap双向map HashBiMap<Integer, String> isMap = HashBiMap.create(); isMap.put(1, "str1"); isMap.put(2, "str2"); // inverse():倒转key:value BiMap<String, Integer> newMap = isMap.inverse(); } /** * Lists、Maps等集合工具 */ public void newCollectionUtilTest() { // 初始化一个集合 List<String> list = Lists.newArrayList(); Map<String, String> map = Maps.newHashMap(); Set<String> set = Sets.newHashSet(); list = Lists.newArrayList("1", "2", "3"); // 将list按指定大小分隔 List<List<String>> newLists = Lists.partition(list, 1); // 翻转list元素 list = Lists.reverse(list); // 对不可变集合进行反转 list = ImmutableList.of("4", "5", "6"); ImmutableList t = ImmutableList.copyOf(list); ImmutableList<String> iList = t.reverse(); List<A> aList = initData(); // 函数式编程 // 提取所有对象主键 Set<Integer> itemIdSet = FluentIterable.from(aList).transform(new Function<A, Integer>() { @Override public Integer apply(A a) { return a.getAge(); } }).toSet(); // 将集合按照主键映射成map,场景:主键唯一 Map<String, A> aMap = Maps.uniqueIndex(aList, new Function<A, String>() { @Nullable @Override public String apply(A a) { return a.getName(); } }); // 将集合按照主键映射成map,场景:主键不唯一 // Multimaps.index(Iterable, Function); // 比较两个Map MapDifference diff = Maps.difference(new HashMap(), new HashMap()); diff.entriesInCommon();// 两个Map中都有的映射项,包括匹配的键与值 diff.entriesDiffering();// 键相同但是值不同值映射项。返回的Map的值类型 diff.entriesOnlyOnLeft();// 键只存在于左边Map的映射项 diff.entriesOnlyOnRight();// 键只存在于右边Map的映射项 // 返回两个multiSet的交集 Multiset multiSet = Multisets.intersection(HashMultiset.create(), HashMultiset.create()); // map反转操作 ArrayListMultimap<String, Integer> multimap = ArrayListMultimap.create(); multimap.putAll("b", Ints.asList(2, 4, 6)); multimap.putAll("a", Ints.asList(4, 2, 1)); multimap.putAll("c", Ints.asList(2, 5, 3)); TreeMultimap<Integer, String> inverse = Multimaps.invertFrom(multimap, TreeMultimap.<Integer, String>create()); //1 => {"a"},2 => {"a", "b", "c"} ,3 => {"c"},4 => {"a", "b"},5 => {"c"}, 6 => {"b"} // forMap(Map):Map包装成SetMultimap Map<String, Integer> map2 = ImmutableMap.of("a", 1, "b", 1, "c", 2); SetMultimap<String, String> multimap2 = Multimaps.forMap(map); // multimap:["a" => {1}, "b" => {1}, "c" => {2}] Multimap<Integer, String> inverse2 = Multimaps.invertFrom(multimap, HashMultimap.<Integer, String>create()); // inverse:[1 => {"a","b"}, 2 => {"c"}] // 自定义Multimap的方法允许你指定Multimap中的特定实现// ListMultimap<String, Integer> myMultimap = Multimaps.newListMultimap(// Maps.<String, Collection>newTreeMap(),// new Supplier<LinkedList>() {// public LinkedList get() {// return Lists.newLinkedList();// }// }); } /** * Forwarding装饰着,加强默认的get、add等行为 */ class AddLoggingList<E> extends ForwardingList<E> { final List<E> delegate; // backing list AddLoggingList(List<E> delegate) { this.delegate = delegate; } @Override protected List<E> delegate() { return delegate; } @Override public void add(int index, E elem) { System.out.println("add a elem at index"); super.add(index, elem); } @Override public boolean add(E elem) { System.out.println("add a elem"); return standardAdd(elem); // 用add(int, E)实现 } @Override public boolean addAll(Collection<? extends E> c) { System.out.println("add all elem"); return standardAddAll(c); // 用add实现 } } /** * Forwarding装饰者,加强默认的get、add等行为测试 */ public void forwardingTest(){ List<String> list = new ArrayList<>(); AddLoggingList<String> listWrap = new AddLoggingList(list); listWrap.add("1"); System.out.println(list.size()); } /** * PeekingIterator装饰者,事先窥视[peek()]到下一次调用next()返回的元素。 * 复制一个List,并去除连续的重复元素。 */ public void peekingIteratorTest(){ List<String> source = new ArrayList<>(); List<String> result = Lists.newArrayList(); PeekingIterator<String> iter = Iterators.peekingIterator(source.iterator()); while (iter.hasNext()) { String current = iter.next(); while (iter.hasNext() && iter.peek().equals(current)) { //跳过重复的元素 iter.next(); } result.add(current); } } public static void main(String args[]) { GuavaTest t = new GuavaTest(); t.forwardingTest(); } public List<A> initData() { A a1 = new A(); a1.setAge(22); a1.setGender("sex"); a1.setName("swx1"); A a2 = new A(); a2.setAge(20); a2.setGender("sex"); a2.setName("swx123"); A a3 = new A(); a3.setAge(25); a3.setGender("sex"); a3.setName("swx32"); List<A> list = new ArrayList<>(); list.add(a1); list.add(a2); list.add(a3); return list; } class A { @Nullable private int age; private String name; private String gender; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } }}
/** * LoadingCache:缓存的使用 * ExecutionException是一个包装异常 */ public void loadCacheTest() throws ExecutionException { final Map<Integer, String> map = ImmutableMap.of(1, "v1", 2, "v2", 3, "v3", 4, "v4", 5, "v5"); LoadingCache<Integer, String> cache = CacheBuilder.newBuilder() .maximumSize(1000) // 缓存大小 .expireAfterAccess(1000, TimeUnit.MINUTES) // 缓存项在给定时间内没有被读/写访问,则回收。 .expireAfterWrite(100000, TimeUnit.MINUTES) // 缓存项在给定时间内没有被读,则回收。 .removalListener(new RemovalListener<Integer, String>() { // 自定义移除监听器 public void onRemoval(RemovalNotification<Integer, String> removal) { System.out.println("remove..."); System.out.println(removal.getValue()); } }) .recordStats()// 开启统计功能 .build(new CacheLoader<Integer, String>() { // 自定义加载器,若缓存中没有匹配到则从原数据集中加载,同时进缓存 public String load(Integer key) throws Exception { System.out.println("load..."); return map.get(key); } }); String v5 = cache.get(3);// 获取缓存数据,没有就会加载 String v55 = cache.getIfPresent(5);// 获取缓存数据,没有不会加载 Map amap = cache.asMap(); //包含当前所有加载到缓存的项,不包含没有加载的 CacheStats status = cache.stats(); // 开启统计功能后获取统计信息 double count = status.hitRate();// 命中率 double time = status.averageLoadPenalty(); // 加载新值平均时间 cache.invalidate(2);// 单个移除 cache.invalidateAll(ImmutableList.of(1,2,3)); // 批量移除 cache.invalidateAll(); // 清空缓存 }
import com.google.common.eventbus.AsyncEventBus;import com.google.common.eventbus.EventBus;import com.google.common.eventbus.Subscribe;import java.util.concurrent.Executors;/** * 事件总线 * Created by shiwenxue on 16/7/17. */public class GuavaTest { private static EventBus eventBus = null; public GuavaTest(){ // 初始化事件总线,同步事件总线 eventBus = new EventBus(); // 异步事件总线 eventBus = new AsyncEventBus(Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors())); // 注册事件监听器到事件总线 eventBus.register(new MyEventBus()); } /** * 监听器 * 一个监听器可以监听很多事件对象 * 比如这个监听器就会监听3个事件对象 * */ class MyEventBus { @Subscribe public void myEventHandle1(MyEvent1 event1) { try { Thread.sleep(1000); } catch (InterruptedException e) { } System.out.println("this is event1"); } @Subscribe public void myEventHandle2(MyEvent2 event2) { System.out.println("this is event2"); } @Subscribe public void myEventHandle3(MyEvent3 event3) { System.out.println("this is event3"); } } /** * 事件1 * */ static class MyEvent1 { } /** * 事件2 * */ static class MyEvent2 { } /** * 事件3 * */ static class MyEvent3 { } public static void main(String args[]){ GuavaTest t = new GuavaTest(); // 分发事件 eventBus.post(new MyEvent1()); eventBus.post(new MyEvent2()); System.out.println(1); }}
package cn.gov.zcy.admin;import com.google.common.base.Function;import com.google.common.collect.Lists;import com.google.common.util.concurrent.*;import javax.annotation.Nullable;import java.util.List;import java.util.concurrent.Executors;/** * ListenableFuture 并发编程测试 * Created by shiwenxue on 16/7/22. */public class ListenableFutureTest { // private static ExecutorService executorService = Executors.newFixedThreadPool(2); private static ListeningExecutorService service = null; static { service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(4)); } /** * 监听一个任务 * 任务执行回调,可以根据任务成功与失败分别进行执行回调 */ public void listenOneFuture(final ListenableFuture future) { Futures.addCallback(future, new FutureCallback() { @Override public void onSuccess(@Nullable Object result) { try { System.out.println("task success finish"); } catch (Exception e) { e.printStackTrace(); } } @Override public void onFailure(Throwable t) { System.out.println("task failed finish"); } }); } /** * 监听多个任务 */ public void listenFutures(Iterable futures) throws Exception { // Futures.allAsList(Iterable<ListenableFuture<V>>) 返回所有的ListenableFuture,失败用null代替 ListenableFuture allQueries = Futures.allAsList(futures); // Futures.successfulAsList(Iterable<ListenableFuture<V>>) 返回所有成功的ListenableFuture,有一个失败将会进入失败 ListenableFuture successfulQueries = Futures.successfulAsList(futures); // 监听任务执行情况 Futures.addCallback(successfulQueries, new FutureCallback<Object>() { @Override public void onSuccess(Object arg0) { System.out.println(arg0); System.out.println("tasks success finish"); } @Override public void onFailure(Throwable arg0) { System.out.println(arg0); } }); // Futures.transform(ListenableFuture<A>, AsyncFunction<A, B>, Executor)* :返回一个新的ListenableFuture,对于ListenableFuture的返回值进行转换。 final ListenableFuture transform = Futures.transform(allQueries, new Function<List<Integer>, ListenableFuture<String>>() { @Nullable @Override public ListenableFuture<String> apply(@Nullable List<Integer> results) { System.out.println(String.format("success future:%d", results.size())); // immediateFuture: 立即返回一个待返回值的ListenableFuture。 return Futures.immediateFuture(String.format("success future:%d", results.size())); } }); System.out.println(transform.get()); } public static void main(String[] args) throws Exception { ListenableFutureTest t = new ListenableFutureTest(); MyTask task1 = new MyTask(); MyTask task2 = new MyTask(); MyTask task3 = new MyTask(); // 获取ListenableFuture final ListenableFuture future1 = service.submit(task1); final ListenableFuture future2 = service.submit(task2); final ListenableFuture future3 = service.submit(task3); Iterable futures = Lists.newArrayList(future1, future1, future2); // 对一个任务进行监听 t.listenOneFuture(future1); // 对多个任务同时监听 t.listenFutures(futures); // ListenableFuture 中的基础方法是addListener(Runnable, Executor), 该方法会在多线程运算完的时候,指定的Runnable参数传入的对象会被指定的Executor执行。 future1.addListener(new Runnable() { @Override public void run() { System.out.println("listener task has finished"); } }, Executors.newFixedThreadPool(2)); System.out.println("main function has finished"); } // 自定义任务执行 static class MyTask implements Runnable { @Override public void run() { try { System.out.println("task is running"); Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } } // 自定义回调实现 static class MyCallbackImpl implements FutureCallback { @Override public void onSuccess(@Nullable Object result) { System.out.println(result); } @Override public void onFailure(Throwable t) { throw new RuntimeException(t.getMessage()); } }}
1 1
- com.google.guava工具(1)
- Google Guava学习(6)-Guava集合工具 Multiset
- Google Guava学习(7)-Guava集合工具 Bimap接口
- Google Guava学习(8)-Guava集合工具 Table接口
- Google Guava学习(10)-Guava字符串工具Joiner
- Google Guava学习(10)-Guava字符串工具Spiltter
- Google Guava学习(10)-Guava字符串工具CharMatcher
- google工具类guava
- com.google.guava maven依赖
- Google Guava学习(1)-Guava Optional类
- Google Guava学习(9)-Guava Cache缓存工具(一)
- Google Guava学习(9)-Guava Cache缓存工具(二)
- Google Guava 工具集简介-使用
- [Google Guava] 2.4-集合扩展工具类
- Google Guava 工具集__2__Cache 缓存使用
- [Java工具集]Google Guava 常用功能
- [Google Guava] 2.4-集合扩展工具类
- guava中Range的使用方法(com.google.common.collect.Range)
- 加减交替法的证明过程
- 剑指Offer--题集目录索引
- PHP开发APP接口注意事项
- AbstractQueuedSynchronized源码探索
- Recover Binary Search Tree
- com.google.guava工具(1)
- 《JavaScript高级程序设计》——字符串连接性能测试
- 讲解三层结构和抽象工厂模式的技巧
- PAT(B1011)提交出错,本地IDE可以实现输入,输出。请问错误在什么地方
- oracle 导出的insert语句过长 运行插入错误的解决
- java枚举使用详解
- 动态规划 递推三角形
- Android-sw600dp对平板模拟器没作用
- Java线程和多线程(二)——对象中的wait,notify以及notifyAll方法