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

原文鏈接:http://wetest.qq.com/lab/view/308.html商業轉載請聯系騰訊WeTest獲得授權,非商業轉載請注明出處。
WeTest 導讀
Java 9預計今年也會正式發布,Java 8這個最具變革性且變革性最適于GUI程序的版本,Android終于準備正式支持。從自己開發JavaFx的感受,說一說Java 8應該使用的新特性。程序員,你應該擁抱變化。 (注:本文不講具體語法,具體語法請下載下方分享的《Java 8實戰》。)
James Lau(google的產品經理):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 語言功能的支持。經過這番改弦易轍,依賴于 Java 類文件格式的現有工具和插件仍可繼續工作。今后,Java 8 語言功能將得到 Android 構建系統的原生支持。
一、GUI桌面類軟件特點
GUI圖形界面的應用程序有幾個特點:
● 基于消息驅動模型
● 強交互,實時性要求高
● 用戶觸發執行與用戶觸發結束


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

Java 8的寫法

lambda需要解決的一個核心問題啰嗦,lambda能做的內部類都能做。Java是面向對象的語言,不支持方法。C語言的方法,在java里面可能是一個接口,可能是一個靜態方法。listFiles這個方法需要的是一個行為(行為參數化,更高級的抽象),這個行為是name.endsWith(“.xml”),但是java不支持傳遞行為方法。所以,java 8之前我們不得不用函數接口(只包含一個方法的接口,專有名詞函數接口)對象的方式來對行為進行包裝。刻薄的講FileTypeFilter類命名為FilenameFilterActionWrapper更加貼切。

1、方法引用
Lambda有一種快捷寫法,方法引用。之前說,在Java中定義方法的方式,一種是接口,一種是靜態方法,現有的庫中已經包含有大量的方法。方法引用,可以讓我們重用這些方法,讓這些方法像Lambda一樣能夠被傳遞。

GUI程序中的用法,這種寫法Java 8之前,在JavaFx或者Android程序中都應該會大量出現

Java 8之后的寫法應該是這樣的
這兩者的差別,解釋起來應該是這樣子的。本質:”直接調用這個方法”,Lambda或者java 8之前”描述如何調用這個方法”。你沒必要再去描述如何調用,因為都知道該怎么調用。我們知道GUI程序最基本的設計時MVC,解決的是視圖和邏輯分離,這幾乎是GUI程序設計里面最基本的。邏輯處理方法一般并不會包含在控制器的類里面,而是在邏輯層,有了方法引用你可以直接與邏輯層的方法相關聯。

2、為什么要lambda
● 簡潔的代碼,跟利于行為參數化(高級抽象,if else->參數化-行為參數化)
● 預設的lambda接口,Predicate、Consumer、Function等,java 8大量庫支持。如果你不理解lambda,你將不理解大量Java 8的接口。
● 類型檢查、類型推斷更優
注:寫lambda的時候,參數一定要有含義,本來就不寫類型了,再不寫有含義的變量就真的是天書了。
三、CompetableFuture組合式異步編程
一個解析Android apk信息的類,可能會解析很長一段時間,所以需要有超時。Java 5之前的寫法

Java 5的寫法

Java 8

那么CompletableFuture除了少些幾句代碼之外,它到底有什么好處呢?
● 約定:與設計模式一樣,這是程序員的一種約定。接口返回CompletableFuture,調用者一眼就只這是個異步API,也知道如何調用它
● 同步轉異步:配合lambda,幾句話就能完成。
● 異常傳遞:apkInformation.completeExceptionally(new WeTestRuntimeException(e.getMessage(), e)),其他線程的異常可以傳遞過來。GUI程序里面,異常通常要轉化為用戶的一種視圖。
● 協調:等待多個異步操作完成合并(如查找多家網站酒店價格,取最小值),等待多個異步操作中最快的一個完成,異步操作完成后回調一個函數(異步操作完成,來個Toast)。在以前這些協調性的功能,可能需要借助CountDownLatch,CyclicBarrier來完成。CompletableFuture一步到位
注:CompletableFuture配合Stream可以極大的提高并發的效率
舉個簡單的上面這個例子返回后的用法:

四、Stream流處理
Use stream operations to express refined data processing queries.用流Stream以表達式的方式來完成數據處理。我自己的理解是,以數據庫的操作方式來完成數據的處理。Java 8的Stream內置了許多類似于數據庫的操作filter、sort、map、reduce等。Stream優點:
● 以數據庫操作數據的方式,專注于如何做這個某個步驟,表達式的方式
● 高并發(看到map、reduce就應該能想到了)![//blog-10039692.file.myqcloud.com/1493973418738_2466_1493973419905.jpg)
舉個用法的例子,業務時獲取所有在線的可測試的手機:

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

GUI的彈出框用戶可能并不填內容內容,返回null。

所以,Optional的核心思想就是我明確告訴你可能會返回null,你一定要處理。所以,現在模塊間提供給其他人的接口,如果有可能返回為null都要聲明為Optional。Java 8大量的官方接口也都會放回Optional,這個是一定要學的內容。
Java 8實戰:https://share.weiyun.com/075e6cd0f306c706260fb377c38ac90b
近日,谷歌發布了安卓8.0開發者預覽版。騰訊WeTest立刻在云真機產品中增加了帶有安卓O系統的真機。
想要率先體驗的用戶可以登錄:http://wetest.qq.com/product/cloudphone
如在使用中有任何疑問,歡迎聯系企業qq:800024531

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,694評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,672評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,690評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,019評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,188評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,718評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,438評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,667評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,845評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,384評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容

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