<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    java中創(chuàng)建自己的Tuple


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


    如:一般寫法:    
    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() {
            
    // 測試
            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來實(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、這里只是寫了2,3,如果有需要直接擴(kuò)展實(shí)現(xiàn)就可以了
              2、這里的Tuple類其實(shí)沒多大用處,都可以直接使用Tuple2, Tuple3,但為了方便統(tǒng)一從Tuple入口出去,創(chuàng)建了靜態(tài)方法。這樣寫更具擴(kuò)展性。

      Tuple:
              用來表示一組單獨(dú)的數(shù)據(jù),比如數(shù)據(jù)庫中的一條記錄;這一點(diǎn)很好理解哈,Tuple的每個Item就像一條記錄的每個字段。 
              當(dāng)我們希望函數(shù)返回多個值的時候,我們可以使用Tuple類型作為函數(shù)的返回值,這樣我們就可以不用ref來定義多個參數(shù)了



    Python中的Tuple類型 介紹:

    Tuple 是不可變 list。 一旦創(chuàng)建了一個 tuple 就不能以任何方式改變它。

    Tuple 與 list 的相同之處
    1. 定義 tuple 與定義 list 的方式相同, 除了整個元素集是用小括號包圍的而不是方括號。
    2. Tuple 的元素與 list 一樣按定義的次序進(jìn)行排序。 Tuples 的索引與 list 一樣從 0 開始, 所以一個非空 tuple 的第一個元素總是 t[0]
    3. 負(fù)數(shù)索引與 list 一樣從 tuple 的尾部開始計(jì)數(shù)。
    4. 與 list 一樣分片 (slice) 也可以使用。注意當(dāng)分割一個 list 時, 會得到一個新的 list ;當(dāng)分割一個 tuple 時, 會得到一個新的 tuple。

    Tuple 不存在的方法
    • 不能向 tuple 增加元素。Tuple 沒有 append 或 extend 方法。
    • 不能從 tuple 刪除元素。Tuple 沒有 remove 或 pop 方法。
    • 您不能在 tuple 中查找元素。Tuple 沒有 index 方法。
    • 然而, 您可以使用 in 來查看一個元素是否存在于 tuple 中。


    用 Tuple 的好處

    • Tuple 比 list 操作速度快。如果定義了一個值的常量集,并且唯一要用它做的是不斷地遍歷它,請使用 tuple 代替 list。
    • 如果對不需要修改的數(shù)據(jù)進(jìn)行 “寫保護(hù)”,可以使代碼更安全。使用 tuple 而不是 list 如同擁有一個隱含的 assert 語句,說明這一數(shù)據(jù)是常量。如果必須要改變這些值,則需要執(zhí)行 tuple 到 list 的轉(zhuǎn)換。

    Tuple 與 list 的轉(zhuǎn)換
    Tuple 可以轉(zhuǎn)換成 list,反之亦然。內(nèi)置的 tuple 函數(shù)接收一個 list,并返回一個有著相同元素的 tuple。而 list 函數(shù)接收一個 tuple 返回一個 list。從效果上看,tuple 凍結(jié)一個 list,而 list 解凍一個 tuple。

    Tuple 的其他應(yīng)用
    一次賦多值
    >>> v = ('a', 'b', 'e')
    >>> (x, y, z) = v
    解釋:v 是一個三元素的 tuple, 并且 (x, y, z) 是一個三變量的 tuple。將一個 tuple 賦值給另一個 tuple, 會按順序?qū)?v  的每個值賦值給每個變量。



               Microsoft在MSDN中對Tuple的描述是“A tuple is a data structure that has a specific number and sequence of values.”,由于E文水平有限,我理解的大概意思就是:Tuple是具有指定數(shù)量和順序的值的一種數(shù)據(jù)結(jié)構(gòu)。針對這種數(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>  

        通過這些Tuple類型的聲明我們可以看出.Net4.0中提供了從包含1個值到最多8個值的Tuple,我們可以通過第一個Tuple的靜態(tài)方法 Create來創(chuàng)建一個泛型Tuple<>的實(shí)例,例如Tuple<string, int> t = Tuple.Create("key", 789); 也可以使用泛型Tuple的構(gòu)造函數(shù)來創(chuàng)建實(shí)例,例如Tuple<string, int> t =  new Tuple<string, int>("key", 324);

     知道了Tuple類型的定義后,我們什么時候會用到它呢?對于Tuple<T>來說,我覺得我們大多數(shù)時候都不會使用這樣一個數(shù)據(jù)類型將一個實(shí)際要用的類型包裝起來,然后進(jìn)行調(diào)用。(有些人提到Tuple類型用來和F#等語言進(jìn)行交互,我不是很了解關(guān)于F#的細(xì)節(jié),或許是在與F#交互的時候能夠用到吧),拋開Tuple<T>不說,其它的Tuple<>類型為我們的程序開發(fā)帶來了極大的方便。以前當(dāng)我們需要處理若干相關(guān)數(shù)據(jù)的時候,例如員工ID、員工年齡和員工入職時間,為了編程的結(jié)構(gòu)合理,我們會定義一個新的員工類,讓它包含ID、年齡和入職時間等屬性(當(dāng)然,你也可以分別聲明3個變量),現(xiàn)在,我們只需要聲明一個Tuple<string, int, DateTime>的對象即可,省去了定義一個新類的步驟,當(dāng)然,我們這么做是以犧牲代碼的可讀性為代價的,畢竟我們訪問Tuple對象的時候是通過類似Item這樣的沒有實(shí)際含義的屬性來訪問它的成員的。


          

       

    posted on 2011-10-28 18:35 胡鵬 閱讀(6416) 評論(0)  編輯  收藏


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


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

    導(dǎo)航

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

    統(tǒng)計(jì)

    常用鏈接

    留言簿(3)

    隨筆分類

    隨筆檔案

    agile

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 免费看又爽又黄禁片视频1000| 亚洲AV成人无码天堂| 久久WWW色情成人免费观看| 伊人免费在线观看| 亚洲国产精华液2020| 78成人精品电影在线播放日韩精品电影一区亚洲 | 大胆亚洲人体视频| 美女裸身网站免费看免费网站| 两性色午夜视频免费网| 粉色视频成年免费人15次| 亚洲一区二区三区高清不卡 | 无码一区二区三区免费| 亚洲一级片免费看| 老妇激情毛片免费| 亚洲AV无码XXX麻豆艾秋| 亚洲AV无码一区二区三区人 | 免费在线视频你懂的| 久久免费福利视频| 色播在线永久免费视频网站| 看Aⅴ免费毛片手机播放| 亚洲欧美日韩久久精品| 亚洲一区精彩视频| 亚洲砖码砖专无区2023| 亚洲免费福利视频| xxx毛茸茸的亚洲| 亚洲国产成人久久77| 亚洲国产精品综合久久网各| 久久亚洲精品人成综合网| 亚洲va中文字幕无码久久| 亚洲精品无码乱码成人| 亚洲女初尝黑人巨高清| 国产亚洲欧洲Aⅴ综合一区| 亚洲精品和日本精品| 亚洲欧洲国产成人综合在线观看| 国产黄色片在线免费观看| 国产精品高清全国免费观看| 四虎影视在线永久免费看黄 | 思思久久99热免费精品6| 成人久久久观看免费毛片| 九九久久国产精品免费热6| 人人公开免费超级碰碰碰视频 |