java中創(chuàng)建自己的Tuple
起因:在寫(xiě)java的時(shí)候,經(jīng)常遇到函數(shù)需要返回2個(gè)值或者3個(gè)值,java必須編寫(xiě)一個(gè)Object,來(lái)封裝,但很多應(yīng)用場(chǎng)景只是臨時(shí)使用,構(gòu)建對(duì)象感覺(jué)殺雞用宰牛刀,而其他語(yǔ)言有比較好的實(shí)現(xiàn)方法。(當(dāng)然通過(guò)指針引用可以解決一部分問(wèn)題)
如:一般寫(xiě)法:













































使用Tuple來(lái)實(shí)現(xiàn):




















Tuple類:







































































1、這里只是寫(xiě)了2,3,如果有需要直接擴(kuò)展實(shí)現(xiàn)就可以了
2、這里的Tuple類其實(shí)沒(méi)多大用處,都可以直接使用Tuple2, Tuple3,但為了方便統(tǒng)一從Tuple入口出去,創(chuàng)建了靜態(tài)方法。這樣寫(xiě)更具擴(kuò)展性。
Tuple:
用來(lái)表示一組單獨(dú)的數(shù)據(jù),比如數(shù)據(jù)庫(kù)中的一條記錄;這一點(diǎn)很好理解哈,Tuple的每個(gè)Item就像一條記錄的每個(gè)字段。
當(dāng)我們希望函數(shù)返回多個(gè)值的時(shí)候,我們可以使用Tuple類型作為函數(shù)的返回值,這樣我們就可以不用ref來(lái)定義多個(gè)參數(shù)了
Python中的Tuple類型 介紹:
Tuple 是不可變 list。 一旦創(chuàng)建了一個(gè) tuple 就不能以任何方式改變它。
Tuple 與 list 的相同之處
- 定義 tuple 與定義 list 的方式相同, 除了整個(gè)元素集是用小括號(hào)包圍的而不是方括號(hào)。
- Tuple 的元素與 list 一樣按定義的次序進(jìn)行排序。 Tuples 的索引與 list 一樣從 0 開(kāi)始, 所以一個(gè)非空 tuple 的第一個(gè)元素總是 t[0]。
- 負(fù)數(shù)索引與 list 一樣從 tuple 的尾部開(kāi)始計(jì)數(shù)。
- 與 list 一樣分片 (slice) 也可以使用。注意當(dāng)分割一個(gè) list 時(shí), 會(huì)得到一個(gè)新的 list ;當(dāng)分割一個(gè) tuple 時(shí), 會(huì)得到一個(gè)新的 tuple。
Tuple 不存在的方法
- 不能向 tuple 增加元素。Tuple 沒(méi)有 append 或 extend 方法。
- 不能從 tuple 刪除元素。Tuple 沒(méi)有 remove 或 pop 方法。
- 您不能在 tuple 中查找元素。Tuple 沒(méi)有 index 方法。
- 然而, 您可以使用 in 來(lái)查看一個(gè)元素是否存在于 tuple 中。
用 Tuple 的好處
- Tuple 比 list 操作速度快。如果定義了一個(gè)值的常量集,并且唯一要用它做的是不斷地遍歷它,請(qǐng)使用 tuple 代替 list。
- 如果對(duì)不需要修改的數(shù)據(jù)進(jìn)行 “寫(xiě)保護(hù)”,可以使代碼更安全。使用 tuple 而不是 list 如同擁有一個(gè)隱含的 assert 語(yǔ)句,說(shuō)明這一數(shù)據(jù)是常量。如果必須要改變這些值,則需要執(zhí)行 tuple 到 list 的轉(zhuǎn)換。
Tuple 與 list 的轉(zhuǎn)換
Tuple 可以轉(zhuǎn)換成 list,反之亦然。內(nèi)置的 tuple 函數(shù)接收一個(gè) list,并返回一個(gè)有著相同元素的 tuple。而 list 函數(shù)接收一個(gè) tuple 返回一個(gè) list。從效果上看,tuple 凍結(jié)一個(gè) list,而 list 解凍一個(gè) tuple。
Tuple 的其他應(yīng)用
一次賦多值
>>> v = ('a', 'b', 'e')
>>> (x, y, z) = v
解釋:v 是一個(gè)三元素的 tuple, 并且 (x, y, z) 是一個(gè)三變量的 tuple。將一個(gè) tuple 賦值給另一個(gè) tuple, 會(huì)按順序?qū)?v 的每個(gè)值賦值給每個(gè)變量。
Microsoft在MSDN中對(duì)Tuple的描述是“A tuple is a data structure that has a specific number and sequence of values.”,由于E文水平有限,我理解的大概意思就是:Tuple是具有指定數(shù)量和順序的值的一種數(shù)據(jù)結(jié)構(gòu)。針對(duì)這種數(shù)據(jù)結(jié)構(gòu),.Net4.0中提供了一組Tuple類型,具體如下:
Tuple | |
Tuple<T> | |
Tuple<T1, T2> | |
Tuple<T1, T2, T3> | |
Tuple<T1, T2, T3, T4> | |
Tuple<T1, T2, T3, T4, T5> | |
Tuple<T1, T2, T3, T4, T5, T6> | |
Tuple<T1, T2, T3, T4, T5, T6, T7> | |
Tuple<T1, T2, T3, T4, T5, T6, T7, TRest> |
通過(guò)這些Tuple類型的聲明我們可以看出.Net4.0中提供了從包含1個(gè)值到最多8個(gè)值的Tuple,我們可以通過(guò)第一個(gè)Tuple的靜態(tài)方法 Create來(lái)創(chuàng)建一個(gè)泛型Tuple<>的實(shí)例,例如Tuple<string, int> t = Tuple.Create("key", 789); 也可以使用泛型Tuple的構(gòu)造函數(shù)來(lái)創(chuàng)建實(shí)例,例如Tuple<string, int> t = new Tuple<string, int>("key", 324);
知道了Tuple類型的定義后,我們什么時(shí)候會(huì)用到它呢?對(duì)于Tuple<T>來(lái)說(shuō),我覺(jué)得我們大多數(shù)時(shí)候都不會(huì)使用這樣一個(gè)數(shù)據(jù)類型將一個(gè)實(shí)際要用的類型包裝起來(lái),然后進(jìn)行調(diào)用。(有些人提到Tuple類型用來(lái)和F#等語(yǔ)言進(jìn)行交互,我不是很了解關(guān)于F#的細(xì)節(jié),或許是在與F#交互的時(shí)候能夠用到吧),拋開(kāi)Tuple<T>不說(shuō),其它的Tuple<>類型為我們的程序開(kāi)發(fā)帶來(lái)了極大的方便。以前當(dāng)我們需要處理若干相關(guān)數(shù)據(jù)的時(shí)候,例如員工ID、員工年齡和員工入職時(shí)間,為了編程的結(jié)構(gòu)合理,我們會(huì)定義一個(gè)新的員工類,讓它包含ID、年齡和入職時(shí)間等屬性(當(dāng)然,你也可以分別聲明3個(gè)變量),現(xiàn)在,我們只需要聲明一個(gè)Tuple<string, int, DateTime>的對(duì)象即可,省去了定義一個(gè)新類的步驟,當(dāng)然,我們這么做是以犧牲代碼的可讀性為代價(jià)的,畢竟我們?cè)L問(wèn)Tuple對(duì)象的時(shí)候是通過(guò)類似Item這樣的沒(méi)有實(shí)際含義的屬性來(lái)訪問(wèn)它的成員的。
posted on 2011-10-28 18:35 胡鵬 閱讀(6406) 評(píng)論(0) 編輯 收藏