代碼簡化探索

代碼簡化探索

class User{

    private int no;
    private String name;

    public User(int no, String name){
        this.no = no;
        this.name = name;
    }

    public int getNo(){
        return no;
    }

    public void setNo(int no){
        this.no = no;
    }

    public String getName(){
        return name;
    }

    @Override
    public String toString(){
        return "User{" +
               "no=" + no +
               ", name='" + name + '\'' +
               '}';
    }

    public void setName(String name){
        this.name = name;
    }
}
public static void main(String[] args){

    List<User> list = new ArrayList<>();
    list.add(new User(1, "zhao"));
    list.add(new User(3, "qian"));
    list.add(null);
    list.add(null);
    list.add(new User(7, "li"));

    for(User user : list){
        if(3 == user.getNo()){
            System.out.println("----------- " + user);
            break;
        }
    }
}

對于 for 循環(huán)中的代碼熙卡,非常的丑陋赎瑰,也不能擴展

思考1:使用自定義加強的 ArrayList准潭,可以像 Map 一樣通過 key 獲取到 value

public abstract class EnhanceArrayList<K, E> extends ArrayList<E>{

    public abstract K generateKey(E e);

    private Map<K, E> mMap = new HashMap<>(); // 可以優(yōu)化為 K,Integer

    public E getE(K k){
        return mMap.get(k);
    }

    @Override
    public boolean add(E e){
        mMap.put(generateKey(e), e);
        return super.add(e);
    }

    @Override
    public void add(int index, E e){
        super.add(index, e);
        mMap.put(generateKey(e), e);
    }

    @Override
    public E remove(int index){
        E remove = super.remove(index);
        mMap.remove(generateKey(remove));
        return remove;
    }

    @Override
    public boolean remove(Object o){
        K k = generateKey((E)o);
        mMap.remove(k);
        return super.remove(o);
    }
}

原理:在已有的 ArrayList 上添加一個 Map 來保存鍵值對典尾,以通過 key 來獲取 value 身冀, 從而避免 for 循環(huán)

EnhanceArrayList<Integer, User> list = new EnhanceArrayList<Integer, User>(){
    @Override
    public Integer generateKey(User user){
        return user == null ? null : user.getNo();
    }
};
list.add(new User(1, "zhao"));
list.add(new User(3, "qian"));
list.add(null);
list.add(null);
list.add(new User(7, "li"));

System.out.println("------ " + list.getE(3));

需要注意的是具體的實現(xiàn)類中需要對對象進行非空判斷睹耐。
可以向 list 中 add null辐赞,這個知識點給忘記了。

感覺侵入性太強硝训,聲明變量時需使用實現(xiàn)類响委。

思考2:能不能寫成工具類?

本來以為對于具體的比較行為工具類不能知道窖梁,應(yīng)該實現(xiàn)不了工具類赘风。突然想到,無法確定的部分抽象給子類去實現(xiàn)就好了纵刘。

public abstract class ListUtil<E, K>{

    public abstract boolean isEqual(E e1, K o);

    public E findE(List<E> list, K source){
        if(list != null && !list.isEmpty()){
            for(E e : list){
                if(isEqual(e, source)){
                    return e;
                }
            }
        }
        return null;
    }
}
List<User> list = new ArrayList<>();
list.add(new User(1, "zhao"));
list.add(new User(3, "qian"));
list.add(null);
list.add(null);
list.add(new User(7, "li"));

User user = new ListUtil<User, Integer>(){

    @Override
    public boolean isEqual(User e1, Integer o){
        return e1 != null && e1.getNo() == o;
    }
}.findE(list, 3);

貌似實現(xiàn)了贝次,但是工具類是抽象類,這個總感覺怪怪的彰导,那么是不是可以加個接口來替代抽象類蛔翅。

思考3:

public final class ListUtil1<E, K>{

    public E findE(List<E> list, K source, Comparator<E, K> comparator){
        if(list != null && !list.isEmpty() && comparator != null){
            for(E e : list){
                if(comparator.isEqual(e, source)){
                    return e;
                }
            }
        }
        return null;
    }

    public interface Comparator<E, K>{

        boolean isEqual(E e1, K o);
    }
}

把上一步的抽象方法放在了接口中敲茄,然后把接口放在方法參數(shù)中。

List<User> list = new ArrayList<>();
list.add(new User(1, "zhao"));
list.add(new User(3, "qian"));
list.add(null);
list.add(null);
list.add(new User(7, "li"));

User user = new ListUtil1<User, Integer>().findE(list, 3, new ListUtil1.Comparator<User, Integer>(){
    @Override
    public boolean isEqual(User e1, Integer o){
        return e1 != null && e1.getNo() == o;
    }
});
System.out.println("----- " + user);

這兒參考了 Collections.sort(List<T> list, Comparator<? super T> c) 方法

編寫第三種代碼的時候山析,總覺得有點 RxJava 的影子堰燎。以后詳細分析。

總結(jié):
對比以上三種實現(xiàn)笋轨,最合理的應(yīng)該是第三種了秆剪,從接口的層面抽象出了代碼,但是相對第二種給方法增加了參數(shù)爵政,而且實現(xiàn)時需要判斷參數(shù)是否為 null仅讽,且每次都需要 new 一個對象。
雖然第二種怪怪的钾挟,但在項目中性能應(yīng)該較第三種高洁灵,個人傾向于使用第二種。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掺出,一起剝皮案震驚了整個濱河市徽千,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌汤锨,老刑警劉巖双抽,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異闲礼,居然都是意外死亡牍汹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門柬泽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柑贞,“玉大人,你說我怎么就攤上這事聂抢。” “怎么了棠众?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵琳疏,是天一觀的道長。 經(jīng)常有香客問我闸拿,道長空盼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任新荤,我火速辦了婚禮揽趾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘苛骨。我一直安慰自己篱瞎,他們只是感情好苟呐,可當(dāng)我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著俐筋,像睡著了一般牵素。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上澄者,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天笆呆,我揣著相機與錄音,去河邊找鬼粱挡。 笑死赠幕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的询筏。 我是一名探鬼主播榕堰,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼屈留!你這毒婦竟也來了局冰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤灌危,失蹤者是張志新(化名)和其女友劉穎康二,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勇蝙,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡沫勿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了味混。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片产雹。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖翁锡,靈堂內(nèi)的尸體忽然破棺而出蔓挖,到底是詐尸還是另有隱情,我是刑警寧澤馆衔,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布瘟判,位于F島的核電站,受9級特大地震影響角溃,放射性物質(zhì)發(fā)生泄漏拷获。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一减细、第九天 我趴在偏房一處隱蔽的房頂上張望匆瓜。 院中可真熱鬧,春花似錦、人聲如沸驮吱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽糠馆。三九已至嘶伟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間又碌,已是汗流浹背九昧。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留毕匀,地道東北人铸鹰。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像皂岔,于是被迫代替她去往敵國和親蹋笼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法躁垛,類相關(guān)的語法剖毯,內(nèi)部類的語法,繼承相關(guān)的語法教馆,異常的語法逊谋,線程的語...
    子非魚_t_閱讀 31,624評論 18 399
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,082評論 25 707
  • 初曦
    林紅菊閱讀 220評論 0 0
  • 這世上最不可辜負的便是佳人和美酒。 每當(dāng)陳十四酩酊大醉時土铺,便會呢喃自語胶滋。陳十四是個劍客,孤獨的劍客悲敷。一襲白衣究恤,一柄...
    河鼓二閱讀 619評論 1 1
  • 如果要想使一個API真正可用,就必須為其編寫文檔后德。傳統(tǒng)意義上的API文檔是手動生成的部宿,所以保持文檔與代碼同步是一件...
    真愛也枉然閱讀 636評論 0 0