kotlin和java對比

Kotlin是功能非常強大的編程語言,在java以及多種語言的基礎(chǔ)上巫击,去掉了冗余代碼,方便開發(fā)者用較少的模板編寫更多的代碼精续。尤其是在Android開發(fā)中坝锰。除了編程語言自身和它的類之外,Kotlin還為已有的Java類提供一組好用的擴展重付。這個例子是請求API和下載結(jié)果的方法顷级,通過對比我們可以更加直觀了解kotlin的藝術(shù)。

API請求:Java 與 Kotlin對比

使用android studio的kotlin插件确垫,可以很方便的把java代碼轉(zhuǎn)換成kotlin代碼弓颈,通過兩種語言進行對比,看看堅持使用Java會錯過什么删掀。

下面是java代碼:
  public String url(String apiUrl) {
    try {
        URL url = null;
        url = new URL(apiUrl);


        urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.setRequestMethod("GET");
        urlConnection.connect();

        InputStream inputStream = urlConnection.getInputStream();
        StringBuffer buffer = new StringBuffer();
        if (inputStream == null) {
            // Nothing to do.
            return null;
        }
        reader = new BufferedReader(new InputStreamReader(inputStream));

        String line;
        while ((line = reader.readLine()) != null) {
            buffer.append(line + "\n");
        }

        if (buffer.length() == 0) {
            return null;
        }
        result = buffer.toString();
    } catch (ProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        Log.e("Request", "Error ", e);
        return null;
    } finally {
        if (urlConnection != null) {
            urlConnection.disconnect();
        }
        if (reader != null) {
            try {
                reader.close();
            } catch (final IOException e) {
                Log.e("Request", "Error closing stream", e);
            }
        }
    }
    return null;
}

下面是kotlin代碼

    fun url(apiUrl: String): String? {
       return URL(apiUrl).readText()
    }

沒有看錯翔冀,就是一行,是不是很神奇爬迟,Kotlin標準庫為URL類提供了擴展函數(shù)橘蜜,避免我們編寫所有代碼菊匿。
對于大量的響應(yīng)付呕,不建議使用這個函數(shù)计福,但是在大多數(shù)情況下,它是足夠了徽职。如果不這樣象颖,還有許多其他有趣的擴展函數(shù),如:BufferedReader.forEachLine()姆钉,它產(chǎn)生行Sequence说订,我們可以用它們中任何一個〕逼浚或是陶冷,可以通過BufferedReader.lineSequence()得到原始的Sequence<String>。這時毯辅,你能夠使用Sequence進行各種操作埂伦,如:過濾、排序思恐、映射等等沾谜。

異步請求

主線程是負責(zé)UI呈現(xiàn)和交互的,我們不應(yīng)該因其它運行時間長的任務(wù)阻塞它胀莹,這將會影響UI性能基跑。在HTTP請求情況下, Android SDK甚至通過拋出一個異常來阻止我們這么做描焰。在Android典型的解決方案是使用AsyncTask
媳否。AsyncTask有一個doInBackground抽象方法,使得方法在另個線程中執(zhí)行荆秦。

java例子

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView textView = (TextView) findViewById(R.id.tv_title);
        textView.setText("hello");
        task = new AsyncTask<Void, Void, String>() {
            @Override
            protected String doInBackground(Void... params) {
                return requestFromServer("<api call>");
            }

            @Override
            protected void onPostExecute(String s) {
                if (!isFinishing() && !isCancelled()) {
                    Log.d("Request", s);
                    Toast.makeText(MainActivity2.this, "Request performed", Toast.LENGTH_LONG).show();
                }
            }
        };
    }
  @Override
    protected void onDestroy() {
        super.onDestroy();

        if (task != null) {
            task.cancel(true);
            task = null;
        }
    }

    private String requestFromServer(String s) {
        return s;
    }

這實在不清晰也不直觀逆日。學(xué)習(xí)Kotlin開發(fā)時,我們不能漏掉Anko庫萄凤。它主要目的是提供DSL方式用代碼來創(chuàng)建布局室抽,而不是用XML。我實際使用過XML靡努,所以我現(xiàn)在不使用它了坪圾,但是它還是包括一整套非常有用的特性。特別對異步任務(wù)有些小的DSL惑朦。

Kotlin代碼

 val result = URL("<api call>").readText()
  uiThread { 
 Log.d("Request", result)
 longToast("Request performed") 
  }
 }

實際上兽泄,你有async函數(shù),它將在另一個線程中執(zhí)行代碼漾月,并由uiThread
給出返回主線的機會病梢。async是Context的擴展函數(shù)實現(xiàn),且使用它弱應(yīng)用,所以不會阻止GC釋放內(nèi)存蜓陌。

uiThread
優(yōu)勢的方面是它依據(jù)使用類觅彰,以用不同的方式來實現(xiàn)。如果我們從Activity中調(diào)用它钮热,假設(shè)actiivity.isFinishing()
返回true填抬,uiThread代碼是不會執(zhí)行的,并且在此情況下不會崩潰隧期。

假設(shè)你要用future飒责,Async返回Java Future。如果你需要返回future結(jié)果仆潮,就可以用asyncResult宏蛉。

你還能夠用你自己的執(zhí)行器:

 doAsync(executor) {
   // Some task
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市性置,隨后出現(xiàn)的幾起案子檐晕,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異丰捷,居然都是意外死亡,警方通過查閱死者的電腦和手機芥喇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凰萨,“玉大人继控,你說我怎么就攤上這事∨志欤” “怎么了武通?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長珊搀。 經(jīng)常有香客問我冶忱,道長,這世上最難降的妖魔是什么境析? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任囚枪,我火速辦了婚禮,結(jié)果婚禮上劳淆,老公的妹妹穿的比我還像新娘链沼。我一直安慰自己,他們只是感情好沛鸵,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布括勺。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疾捍。 梳的紋絲不亂的頭發(fā)上奈辰,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音拾氓,去河邊找鬼冯挎。 笑死底哥,一個胖子當著我的面吹牛咙鞍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播趾徽,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼续滋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了孵奶?” 一聲冷哼從身側(cè)響起疲酌,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎了袁,沒想到半個月后朗恳,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡载绿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年粥诫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片崭庸。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡怀浆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出怕享,到底是詐尸還是另有隱情执赡,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布函筋,位于F島的核電站沙合,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏跌帐。R本人自食惡果不足惜灌诅,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望含末。 院中可真熱鬧猜拾,春花似錦、人聲如沸佣盒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盯仪,卻和暖如春紊搪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背全景。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工耀石, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人爸黄。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓滞伟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親炕贵。 傳聞我的和親對象是個殘疾皇子梆奈,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

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