[Java]Guava

Guava是Google开源的,帮助程序员快速写出高质量代码的工具包,下面走马观花地看一下。


Collection

Guava使得我们创建集合类时更简单:
// 创建集合类
List<String> list = Lists.newArrayList();
List<Integer> list = Lists.newArrayList(1, 2, 3);

Map<String, Integer> list = Maps.newHashMap();
而且提供了一些不可变的集合类,比如:ImmutableList、ImmutableMap:
ImmutableMap<String, Integer> map = ImmutableMap.of(  
	"1", 1,  
	"2", 2,  
	"3", 3  
);
ImmutableMap.Builder<String, Integer> builder = ImmutableMap.builder();  
	for (...) {  
		builder.put(name, age);  
	}  
ImmutableMap<String, Integer> map = builder.build(); 
另外在Guava中也提供了一些集合工具类。

EventBus

相当于是对订阅者模式的简单封装,不需要我们再去做什么东西了,简单的用法如下,跟Future比较一下就知道它的好处了:
class MyEvent {
	int value;
	MyEvent(int value) {
		this.value = value;
	}
}

class MyEventListener {
	@Subscribe
	public void listen(MyEvent event) {
		System.out.println(event.value); // 处理消息
	}
}

public class Main {
	public void static main() throws Exception {
		EventBus eventBus = new EventBus("test");

		eventBus.register(new MyEventListener());	// 注册监听者		
		eventBus.post(new MyEvent(200));		// 发布消息
	}
}
在选择处理消息的方法时有两个依据:
  • @Subscribe
  • 参数类型是否和Event的类型匹配

如果event没有被listener消费,那么就会有一个DeadEvent放出来,这样可以监控到哪些消息是乱发的。


Cache

使用Guava可以实现一个本地缓存,简单的用法如下:

Cache<String, String> cache = CacheBuilder.newBuilder().maximumSize(1000).build();

// 从缓存中获取数据
String resultVal = cache.get("jerry", new Callable<String>() {  
	public String call() {  
		String strProValue="hello "+"jerry"+"!";                
		return strProValue;
	}  
}); 
当然,可以设置超时时间等,感觉比较好的地方是可以在key被移除的时候得到通知:
Cache<String, String> cache = CacheBuilder.newBuilder().removalListener(new RemovalListener<K, V>(){
	@Override
	public void onRemoval(RemovalNotification<K, V> rn) {
		System.out.println(rn.getKey()+"被移除");  
	}
}).build(cacheLoader);

ConCurrent

在并发方面,Guava提供的ListenableFuture更好用一点:
public class Test {
	public static void main(String[] args) throws Exception {
		// 创建线程池
		ListeningExecutorService executor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(1));
        ExecutorService executorService = Executors.newFixedThreadPool(1);
		// 创建异步的任务
		final ListenableFuture<String> future = executor.submit(new Callable<String>() {
			public String call() throws Exception {
                Thread.sleep(1000);
				return "Hello, ";
			}
		});
        // 设置监听器A
		future.addListener(new Runnable() {
			public void run() {
				try {
					System.out.println(future.get() + "A");
				} catch (InterruptedException e) {
					future.cancel(true);
				} catch (ExecutionException e) {
					future.cancel(true);
				}
			}
		}, executorService);
        // 设置监听器B
        future.addListener(new Runnable() {
            public void run() {
                try {
                    System.out.println(future.get() + "B");
                } catch (InterruptedException e) {
                    future.cancel(true);
                } catch (ExecutionException e) {
                    future.cancel(true);
                }
            }
        }, executorService);

		System.out.println("exit..");
	}
}

reflect

在Guava中提供了一些工具,简化了反射的使用,比如获取泛型的类型时:
import java.lang.reflect.Type;
import com.google.common.reflect.TypeToken;

abstract class GetT<T> {
	TypeToken<T> type = new TypeToken<T>(getClass()) {
	};
}

public class Test<T> extends GetT<T> {
	public static void main(String[] args) throws Exception {
		Type t = new Test<String>() {
		}.type.getType();
		System.out.println(t);
	}
}
关于泛型的其他东西可以看这里

----------END----------
### Java Guava 库的使用与文档 Guava 是由 Google 开发并维护的一套核心库集合,提供了许多实用工具类来简化日常编程工作[^1]。这些工具涵盖了集合框架增强、缓存机制、原生不可变集合支持以及字符串处理等多个方面。 #### 基本功能展示 ##### 不可变集合 为了创建一个不可变列表,可以采用如下方式: ```java import com.google.common.collect.ImmutableList; ImmutableList<String> immutableList = ImmutableList.of("apple", "banana"); // 尝试修改该列表将会抛出 UnsupportedOperationException 异常 immutableList.add("orange"); ``` ##### 缓存构建器 CacheBuilder 的简单应用实例 下面是一个简单的例子展示了如何利用 `CacheBuilder` 来实现带有过期策略的记忆化函数: ```java import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; public class Example { private static final int MAX_SIZE = 100; // 设置最大容量 private static final long EXPIRE_AFTER_WRITE_DURATION = 10L; // 单位秒 public static void main(String[] args) throws Exception { Cache<Object, Object> cache = CacheBuilder.newBuilder() .maximumSize(MAX_SIZE) .expireAfterWrite(EXPIRE_AFTER_WRITE_DURATION, TimeUnit.SECONDS) .build(); // 使用cache.put() 和 cache.getIfPresent() 方法来进行数据存储和检索... } } ``` ##### Joiner 和 Splitter 类用于高效拼接拆分字符串 当涉及到大量字符串连接操作时,Joiner 可以显著提高性能;而 Splitter 则适用于快速分割字符串为多个部分: ```java import com.google.common.base.Joiner; import com.google.common.base.Splitter; String joined = Joiner.on("; ").join(Arrays.asList("a", "b", "c")); Iterable<String> split = Splitter.on(';').trimResults().omitEmptyStrings().split("foo;bar;; qux ;"); System.out.println(joined); // 输出:"a; b; c" for (String s : split) { // 迭代输出 ["foo","bar","qux"] System.out.print(s + ", "); } ``` 通过上述几个方面的介绍可以看出,Guava 提供了许多强大而又便捷的功能模块,在实际开发过程中能够极大地提升编码效率和程序质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值