程序員要擁抱變化瞻佛,聊聊Android即將支持的Java

原文鏈接:http://wetest.qq.com/lab/view/308.html商業(yè)轉(zhuǎn)載請聯(lián)系騰訊WeTest獲得授權(quán)咖熟,非商業(yè)轉(zhuǎn)載請注明出處。
WeTest 導(dǎo)讀
Java 9預(yù)計今年也會正式發(fā)布徒仓,Java 8這個最具變革性且變革性最適于GUI程序的版本,Android終于準(zhǔn)備正式支持誊垢。從自己開發(fā)JavaFx的感受,說一說Java 8應(yīng)該使用的新特性症见。程序員喂走,你應(yīng)該擁抱變化。 (注:本文不講具體語法谋作,具體語法請下載下方分享的《Java 8實戰(zhàn)》芋肠。)
James Lau(google的產(chǎn)品經(jīng)理):We’ve decided to add support for Java 8 language features directly into the current javac and dx set of tools, and deprecate the Jack toolchain. With this new direction, existing tools and plugins dependent on the Java class file format should continue to work. Moving forward, Java 8 language features will be natively supported by theAndroid build system.
我們決定棄用 Jack 工具鏈,改為直接在最新的 javac 和 dx 工具集中增加對 Java 8 語言功能的支持遵蚜。經(jīng)過這番改弦易轍帖池,依賴于 Java 類文件格式的現(xiàn)有工具和插件仍可繼續(xù)工作。今后吭净,Java 8 語言功能將得到 Android 構(gòu)建系統(tǒng)的原生支持睡汹。
一、GUI桌面類軟件特點
GUI圖形界面的應(yīng)用程序有幾個特點:
● 基于消息驅(qū)動模型
● 強交互寂殉,實時性要求高
● 用戶觸發(fā)執(zhí)行與用戶觸發(fā)結(jié)束


二囚巴、Lambda表達(dá)式
舉個實際應(yīng)用中的例子,下面這部分的代碼是過濾出某個目錄下所有xml后綴的文件友扰,java 8之前的寫法是這樣子的:

Java 8的寫法

lambda需要解決的一個核心問題啰嗦彤叉,lambda能做的內(nèi)部類都能做。Java是面向?qū)ο蟮恼Z言村怪,不支持方法秽浇。C語言的方法,在java里面可能是一個接口甚负,可能是一個靜態(tài)方法柬焕。listFiles這個方法需要的是一個行為(行為參數(shù)化,更高級的抽象)腊敲,這個行為是name.endsWith(“.xml”)击喂,但是java不支持傳遞行為方法。所以碰辅,java 8之前我們不得不用函數(shù)接口(只包含一個方法的接口懂昂,專有名詞函數(shù)接口)對象的方式來對行為進(jìn)行包裝∶槐觯刻薄的講FileTypeFilter類命名為FilenameFilterActionWrapper更加貼切凌彬。

1沸柔、方法引用
Lambda有一種快捷寫法,方法引用铲敛。之前說褐澎,在Java中定義方法的方式,一種是接口伐蒋,一種是靜態(tài)方法工三,現(xiàn)有的庫中已經(jīng)包含有大量的方法。方法引用先鱼,可以讓我們重用這些方法俭正,讓這些方法像Lambda一樣能夠被傳遞。

GUI程序中的用法,這種寫法Java 8之前焙畔,在JavaFx或者Android程序中都應(yīng)該會大量出現(xiàn)

Java 8之后的寫法應(yīng)該是這樣的
這兩者的差別掸读,解釋起來應(yīng)該是這樣子的。本質(zhì):”直接調(diào)用這個方法”,Lambda或者java 8之前”描述如何調(diào)用這個方法”宏多。你沒必要再去描述如何調(diào)用儿惫,因為都知道該怎么調(diào)用。我們知道GUI程序最基本的設(shè)計時MVC伸但,解決的是視圖和邏輯分離肾请,這幾乎是GUI程序設(shè)計里面最基本的。邏輯處理方法一般并不會包含在控制器的類里面砌烁,而是在邏輯層筐喳,有了方法引用你可以直接與邏輯層的方法相關(guān)聯(lián)。

2函喉、為什么要lambda
● 簡潔的代碼避归,跟利于行為參數(shù)化(高級抽象,if else->參數(shù)化-行為參數(shù)化)
● 預(yù)設(shè)的lambda接口管呵,Predicate梳毙、Consumer、Function等捐下,java 8大量庫支持账锹。如果你不理解lambda,你將不理解大量Java 8的接口坷襟。
● 類型檢查奸柬、類型推斷更優(yōu)
注:寫lambda的時候,參數(shù)一定要有含義婴程,本來就不寫類型了廓奕,再不寫有含義的變量就真的是天書了。
三、CompetableFuture組合式異步編程
一個解析Android apk信息的類桌粉,可能會解析很長一段時間蒸绩,所以需要有超時。Java 5之前的寫法

Java 5的寫法

Java 8

那么CompletableFuture除了少些幾句代碼之外铃肯,它到底有什么好處呢患亿?
● 約定:與設(shè)計模式一樣,這是程序員的一種約定押逼。接口返回CompletableFuture步藕,調(diào)用者一眼就只這是個異步API,也知道如何調(diào)用它
● 同步轉(zhuǎn)異步:配合lambda挑格,幾句話就能完成漱抓。
● 異常傳遞:apkInformation.completeExceptionally(new WeTestRuntimeException(e.getMessage(), e)),其他線程的異乘∑耄可以傳遞過來。GUI程序里面瞬逊,異常通常要轉(zhuǎn)化為用戶的一種視圖显歧。
● 協(xié)調(diào):等待多個異步操作完成合并(如查找多家網(wǎng)站酒店價格,取最小值)确镊,等待多個異步操作中最快的一個完成士骤,異步操作完成后回調(diào)一個函數(shù)(異步操作完成,來個Toast)蕾域。在以前這些協(xié)調(diào)性的功能拷肌,可能需要借助CountDownLatch,CyclicBarrier來完成旨巷。CompletableFuture一步到位
注:CompletableFuture配合Stream可以極大的提高并發(fā)的效率
舉個簡單的上面這個例子返回后的用法:

四巨缘、Stream流處理
Use stream operations to express refined data processing queries.用流Stream以表達(dá)式的方式來完成數(shù)據(jù)處理。我自己的理解是采呐,以數(shù)據(jù)庫的操作方式來完成數(shù)據(jù)的處理若锁。Java 8的Stream內(nèi)置了許多類似于數(shù)據(jù)庫的操作filter、sort斧吐、map又固、reduce等。Stream優(yōu)點:
● 以數(shù)據(jù)庫操作數(shù)據(jù)的方式煤率,專注于如何做這個某個步驟仰冠,表達(dá)式的方式
● 高并發(fā)(看到map、reduce就應(yīng)該能想到了)![//blog-10039692.file.myqcloud.com/1493973418738_2466_1493973419905.jpg)
舉個用法的例子蝶糯,業(yè)務(wù)時獲取所有在線的可測試的手機:

注:Stream的寫法的確對原因的思維方式會造成一定的沖擊洋只,不過寫過了,加上有一定數(shù)據(jù)庫使用基礎(chǔ)的話理解起來非常容易。Stream高性能的特點的確感受不深木张,因為處理大量數(shù)據(jù)的情況畢竟是少數(shù)众辨。
五、Optional
A container object which may or may not contain a non-null value.一個可能包含null指的對象包裝器舷礼。null不可避免鹃彻,能避免的是NullPointerException。null最大的罪在于它可以代表任何類型妻献。下面這兩個接口蛛株,不去看你的注釋,我并不知道你是否可能會返回null育拨。在業(yè)務(wù)需求變化如此快的今天谨履,貼切非常容易出現(xiàn)對返回值不做檢查的情況,任何人都會偷懶熬丧。Optional的處理邏輯是笋粟,強迫你去檢查。如果我的返回值是Optional析蝴,這個接口顯式的告訴你可能返回的是null值害捕,這個在GUI程序里面特別常見。

GUI的彈出框用戶可能并不填內(nèi)容內(nèi)容闷畸,返回null尝盼。

所以,Optional的核心思想就是我明確告訴你可能會返回null佑菩,你一定要處理盾沫。所以,現(xiàn)在模塊間提供給其他人的接口殿漠,如果有可能返回為null都要聲明為Optional赴精。Java 8大量的官方接口也都會放回Optional,這個是一定要學(xué)的內(nèi)容绞幌。
Java 8實戰(zhàn):https://share.weiyun.com/075e6cd0f306c706260fb377c38ac90b
近日祖娘,谷歌發(fā)布了安卓8.0開發(fā)者預(yù)覽版。騰訊WeTest立刻在云真機產(chǎn)品中增加了帶有安卓O系統(tǒng)的真機啊奄。
想要率先體驗的用戶可以登錄:http://wetest.qq.com/product/cloudphone
如在使用中有任何疑問渐苏,歡迎聯(lián)系企業(yè)qq:800024531

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市菇夸,隨后出現(xiàn)的幾起案子琼富,更是在濱河造成了極大的恐慌,老刑警劉巖庄新,帶你破解...
    沈念sama閱讀 223,002評論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鞠眉,死亡現(xiàn)場離奇詭異薯鼠,居然都是意外死亡,警方通過查閱死者的電腦和手機械蹋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評論 3 400
  • 文/潘曉璐 我一進(jìn)店門出皇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人哗戈,你說我怎么就攤上這事郊艘。” “怎么了唯咬?”我有些...
    開封第一講書人閱讀 169,787評論 0 365
  • 文/不壞的土叔 我叫張陵纱注,是天一觀的道長。 經(jīng)常有香客問我胆胰,道長狞贱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,237評論 1 300
  • 正文 為了忘掉前任蜀涨,我火速辦了婚禮瞎嬉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘厚柳。我一直安慰自己佑颇,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,237評論 6 398
  • 文/花漫 我一把揭開白布草娜。 她就那樣靜靜地躺著,像睡著了一般痒筒。 火紅的嫁衣襯著肌膚如雪宰闰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,821評論 1 314
  • 那天簿透,我揣著相機與錄音移袍,去河邊找鬼。 笑死老充,一個胖子當(dāng)著我的面吹牛葡盗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播啡浊,決...
    沈念sama閱讀 41,236評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼觅够,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了巷嚣?” 一聲冷哼從身側(cè)響起喘先,我...
    開封第一講書人閱讀 40,196評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎廷粒,沒想到半個月后窘拯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體红且,經(jīng)...
    沈念sama閱讀 46,716評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,794評論 3 343
  • 正文 我和宋清朗相戀三年涤姊,在試婚紗的時候發(fā)現(xiàn)自己被綠了暇番。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,928評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡思喊,死狀恐怖壁酬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情搔涝,我是刑警寧澤厨喂,帶...
    沈念sama閱讀 36,583評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站庄呈,受9級特大地震影響蜕煌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜诬留,卻給世界環(huán)境...
    茶點故事閱讀 42,264評論 3 336
  • 文/蒙蒙 一斜纪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧文兑,春花似錦盒刚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至籍铁,卻和暖如春涡上,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拒名。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評論 1 274
  • 我被黑心中介騙來泰國打工吩愧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人增显。 一個月前我還...
    沈念sama閱讀 49,378評論 3 379
  • 正文 我出身青樓雁佳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親同云。 傳聞我的和親對象是個殘疾皇子糖权,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,937評論 2 361

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)炸站,斷路器温兼,智...
    卡卡羅2017閱讀 134,720評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,348評論 25 707
  • 我不會把你 把你,泡在哽咽里 就這樣武契,就這樣募判,就這樣 在不咸不淡的無趣中 沉睡 我要讓整晚的太陽 閃爍婆娑搖曳的酒...
    風(fēng)知道閱讀 221評論 0 0
  • 我想念故鄉(xiāng)的冬荡含! 像黑夜里的雙眼守望黎明那般渴望,像久經(jīng)沙場的戰(zhàn)士期盼凱旋那般殷切届垫,像嗷嗷待哺的嬰兒需要母乳那般急...
    Dasan閱讀 239評論 1 2
  • 文人無雙(原創(chuàng))/微信公眾號“心際花園” 看到一則新聞装处,是美國堪薩斯城郊的一所學(xué)校里误债,女教師給班里的28名學(xué)生判了...
    心際花園閱讀 317評論 0 1