java ImmutableMap的使用說明
ImmutableMap:一個(gè)不可變集合
java中的Immutable對象:
簡單地說,如果一個(gè)對象實(shí)例不能被更改就是一個(gè)Immutable的對象,Java SDK提供的大量值對象,比如String等都是Immutable的對象。
創(chuàng)建ImmutableMap:
Map<String,Object> immutableMap = new ImmutableMap.Builder<String,Object>().build();
在創(chuàng)建時(shí)放值:
Map<String,Object> immutableMap = new ImmutableMap.Builder<String,Object>()
.put("k1","v1")
.put("k2","v2")
.build();
創(chuàng)建后不可變:
immutableMap.put("k1","v3");//會拋出java.lang.UnsupportedOperationException
ImmutableMap中key和value均不能為null,放入null值會拋出NPE
ImmutableMap的使用場景:
適合
1、確定性的配置, 比如根據(jù)不同的key值得到不同的請求url
2、寫單元測試
不適合
1、key, value為未知參數(shù), 可能有null產(chǎn)生的情況
guava中ImmutableMap使用示例及好處
ImmutableMap是不可變的,線程安全的;它可以創(chuàng)建一些常量的映射鍵值對;他提供了很多的組合鍵值對的方法,源碼中使用了一個(gè)靜態(tài)內(nèi)部類來組裝構(gòu)建ImmutableMap,靜態(tài)內(nèi)部類作為外部類的輔助構(gòu)建ImmutableMap,內(nèi)部使用final聲明了一個(gè)ArrayList變量。
public static class Builder<K, V>{
final ArrayList<Map.Entry<K, V>> entries = Lists.newArrayList();
public Builder() {}
public Builder<K, V> put(K key, V value)
{
this.entries.add(ImmutableMap.entryOf(key, value));
return this;
}
public Builder<K, V> put(Map.Entry<? extends K, ? extends V> entry)
{
K key = entry.getKey();
V value = entry.getValue();
if ((entry instanceof ImmutableEntry)) {
Preconditions.checkNotNull(key);
Preconditions.checkNotNull(value);
Map.Entry<K, V> immutableEntry = entry;
this.entries.add(immutableEntry);
}
else
{
this.entries.add(ImmutableMap.entryOf(key, value));
}
return this;
}
public Builder<K, V> putAll(Map<? extends K, ? extends V> map)
{
this.entries.ensureCapacity(this.entries.size() + map.size());
for (Map.Entry<? extends K, ? extends V> entry : map.entrySet()) {
put(entry.getKey(), entry.getValue());
}
return this;
}
public ImmutableMap<K, V> build()
{
return fromEntryList(this.entries);
}
private static <K, V> ImmutableMap<K, V> fromEntryList(List<Map.Entry<K, V>> entries)
{
int size = entries.size();
switch (size) {
case 0:
return ImmutableMap.of();
case 1:
return new SingletonImmutableBiMap((Map.Entry)Iterables.getOnlyElement(entries));
}
Map.Entry<?, ?>[] entryArray = (Map.Entry[])entries.toArray(new Map.Entry[entries.size()]);
return new RegularImmutableMap(entryArray);
}
}
之前我們判斷取值結(jié)果可以使用if else形式:
int a = 1;
if(a == 1) {
System.out.println(a);
} else {
System.out.println(a);
}
或者使用switch方式:
int a = 1;
switch (a) {
case 1:
System.out.println(a);
break;
case 2:
System.out.println(a);
default:
System.out.println(a);
break;
}
現(xiàn)在可以使用ImmutableMap集合來組裝鍵值對,這樣的組合方式既簡單又省去了大量多余的代碼:
ImmutableMap<String, Object> map = ImmutableMap .<String, Object>builder()
.put("1", "1")
.put("2", "2")
.put("3", "3")
.build();
ImmutableMap<String, String> map1 = ImmutableMap .<String, String>of("1", "2");
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
學(xué)習(xí)Java之IO流中有哪些復(fù)雜的API
這篇文章我們要先對IO流的API有個(gè)基本的認(rèn)知,因?yàn)镮O流的類和方法太多了,我們不得不專門學(xué)習(xí)一下,所以本文就給大家詳細(xì)的講講Java?IO流中復(fù)雜的API,需要的朋友可以參考下2023-09-09
spring boot微服務(wù)自定義starter原理詳解
這篇文章主要介紹了spring boot微服務(wù)自定義starter原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
JavaWeb ServletContext基礎(chǔ)與應(yīng)用詳細(xì)講解
ServletConfig對象,叫Servlet配置對象。主要用于加載配置文件的初始化參數(shù)。我們知道一個(gè)Web應(yīng)用里面可以有多個(gè)servlet,如果現(xiàn)在有一份數(shù)據(jù)需要傳給所有的servlet使用,那么我們就可以使用ServletContext對象了2023-01-01
Spring 事務(wù)事件監(jiān)控及實(shí)現(xiàn)原理解析
本文首先會使用實(shí)例進(jìn)行講解Spring事務(wù)事件是如何使用的,然后會講解這種使用方式的實(shí)現(xiàn)原理。感興趣的朋友跟隨小編一起看看吧2018-09-09
SpringBoot實(shí)現(xiàn)使用反射模擬IOC和getBean
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)使用反射模擬IOC和getBean,IOC就是spring的核心思想之一——控制反轉(zhuǎn)。這里不再贅述,看此文章即可了解2023-04-04

