【Guava 教學】(10)進行函數式程式設計
【Guava 教學】(9)ListenableFuture 聽取未來需求 << 前情 由於 JDK8 Lambda 的引進,未來 JDK8 將有進行函數式程式設計的可能性,剛好本站 Java 開發者的函數式程式設計系列 已經告一段落,閱讀該系列的文章,將有助於將來在 JDK8 中,善用那些從函數式程式設計借鏡而來的相關設計,無論是 Lambda 語法或程式庫的使用。 那麼在 JDK7 前的版本呢?如果想在 Java 中進行函數式風格的設計有可能嗎?其實有一些第三方程式庫提供了這類風格的封裝,其中包括了 Guava 程式庫,然而缺少 Lambda 語法的輔助,使用 Guava 程式庫的相關 API 並不一定會因為函數式風格而受益,正如 Guava 的 FunctionalExplained 中提到的,除非使用這些 API 進行函數式風格設計時,對可讀性有所幫助,或者是取得了 惰性 處理上的一些益處,不然命令式仍應是 Java 的風格選擇。 雖然 Guava 的 FunctionalExplained 中也提到,其函數式風格的 API 主要是針對 JDK5 到 JDK7 的使用者,不過使用 JDK8 的 Lambda 語法來搭配 Guava 的函數式風格 API,似乎也是不錯的選擇,特別是你要與 Guava 的其他 API 做溝通,或甚至你覺得 JDK8 的 API 設計得有些醜陋時。 Guava 的 Iterable<String> filteredNames = filter(names, name -> name.length() < 5); 看到傳回值是 Iterable lengthes = transform(names, name -> name.length()); Guava 不提供
Iterable<String> filteredNames = filter( names, and(name -> name.length() < 5, name -> name.startsWith("Java")) ); 那麼,如果想進行鏈狀操作呢?畢竟上面的寫法,比較像是 Java 開發者的函數式程式設計(5) 提到的, boolean anyJAVA = any(transform(filter(names, name -> name.length() < 5), name -> name.toUpperCase()), name -> name.equals("JAVA")); 幾乎沒什麼可讀性,你可以改用 boolean anyJAVA = FluentIterable.from(names) .filter(name -> name.length() < 5) .transform(name -> name.toUpperCase()) .anyMatch(name -> name.equals("JAVA")); 曾經聽其他人說過,看不懂 加上這篇文章,相信再去看 Guava 的 FunctionalExplained,就可以知道它上頭在說些什麼了。
|