原文鏈接: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就應該能想到了)
注: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