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ě)法:    
          public class Tt {
              
              
              
          public static void main(String[] args) {
                  Tt t 
          = new Tt();
                  User user 
          = t.getUser();
                  
                  
          long id = user.getId();
                  String name 
          = user.getName();
                  
                  
          // TODO .. do something
                  
                  
              }

              
              
          public User getUser() {
                  
          // 測(cè)試
                  User user = new User();
                  user.setId(
          1L);
                  user.setName(
          "hello");
                  
          return user;
              }

              
              
          class User {
                  
          private long id;
                  
          private String name;
                  
                  
                  
                  
          public long getId() {
                      
          return id;
                  }

                  
          public void setId(long id) {
                      
          this.id = id;
                  }

                  
          public String getName() {
                      
          return name;
                  }

                  
          public void setName(String name) {
                      
          this.name = name;
                  }

              }

              
          }
              
                             

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


          public class Tt {
              
          public static void main(String[] args) {
                  Tt  t 
          = new Tt();
                  Tuple2
          <Long, String>  user =  t.getUser();
                  
                  
          long id = user._1();
                  String name 
          = user._2();
                  
                  
          // TODO ..do something
                  
                  
              }


              
          private  Tuple2<Long, String> getUser() {
                  
          long id = 1L;
                  String name 
          = "hello";
                  
          return Tuple.tuple(id, name);
              }

          }


          Tuple類:
          import java.io.Serializable;

          public abstract class Tuple implements Serializable {

              
          /**
               * gen by eclipse
               
          */

              
          private static final long serialVersionUID = -8719929625763890308L;

              
          public static <A, B> Tuple2<A, B> tuple(A a, B b) {
                  
          return new Tuple2<A, B>(a, b);
              }


              
          public static <A, B, C, D, E> Tuple3<A, B, C> tuple(A a, B b, C c) {
                  
          return new Tuple3<A, B, C>(a, b, c);
              }


              
          public static final class Tuple2<A, B> extends Tuple implements Serializable {

                  
          /**
                   * gen by eclipse
                   
          */

                  
          private static final long serialVersionUID = 7263645006696591635L;
                  
          private A a;
                  
          private B b;

                  
          private Tuple2(A a, B b) {
                      
          this.a = a;
                      
          this.b = b;
                  }


                  
          public A _1() {
                      
          return this.a;
                  }


                  
          public B _2() {
                      
          return this.b;
                  }

              }


              
          public static final class Tuple3<A, B, C> extends Tuple implements Serializable {

                  
          /**
                   * gen by eclipse
                   
          */

                  
          private static final long serialVersionUID = 482545776907024160L;

                  
          private A a;
                  
          private B b;
                  
          private C c;

                  
          private Tuple3(A a, B b, C c) {
                      
          this.a = a;
                      
          this.b = b;
                      this.c = c;
                  }


                  
          public A _1() {
                      
          return this.a;
                  }


                  
          public B _2() {
                      
          return this.b;
                  }


                  
          public C _3() {
                      
          return this.c;
                  }

              }

          }

          note:
                    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 的相同之處
          1. 定義 tuple 與定義 list 的方式相同, 除了整個(gè)元素集是用小括號(hào)包圍的而不是方括號(hào)。
          2. Tuple 的元素與 list 一樣按定義的次序進(jìn)行排序。 Tuples 的索引與 list 一樣從 0 開(kāi)始, 所以一個(gè)非空 tuple 的第一個(gè)元素總是 t[0]
          3. 負(fù)數(shù)索引與 list 一樣從 tuple 的尾部開(kāi)始計(jì)數(shù)。
          4. 與 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)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          <2011年10月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          統(tǒng)計(jì)

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          agile

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 青阳县| 民丰县| 黄大仙区| 乐平市| 东丽区| 阿拉善右旗| 礼泉县| 南投市| 武清区| 唐山市| 华池县| 天气| 日土县| 得荣县| 防城港市| 阿荣旗| 镇安县| 温州市| 灵武市| 灌云县| 徐水县| 罗山县| 门头沟区| 汶上县| 健康| 讷河市| 靖西县| 布尔津县| 扶沟县| 团风县| 买车| 绍兴市| 如东县| 偏关县| 资阳市| 开阳县| 南溪县| 诸城市| 宁陵县| 赣州市| 肥乡县|