Java 8:使用compose和andThen組合函式
在這篇文章中,我將討論利用 Function 介面提供的兩個組合函式—— compose 和 andThen 來實現函式的組合。
什麼是函式組合?
首先需要建立一些小的可重用函式,然後將這些小函式組合為新函式。
現在,我們怎麼利用 compose 和 andThen 方法來完成函式的組合?
首先,定義兩個簡單的函式—— times2 和 squared。
Function<Integer, Integer> times2 = e -> e * 2; Function<Integer, Integer> squared = e -> e * e;
接下來,使用 compose 和 andThen 將它們連起來。
times2.compose(squared).apply(4); // Returns 32 times2.andThen(squared).apply(4); // Returns 64
如你所見,compose 和 andThen 的不同之處是函式執行的順序不同。compose 函式先執行引數,然後執行呼叫者,而 andThen 先執行呼叫者,然後再執行引數。
我們開始組合函式
我們先建立一個示例,演示如何利用這種方式建立可重用的小程式碼片段——然後我們以不同的方式組合這些程式碼片段。
考慮下面的問題。
有一個文章列表,現在需要根據不同的需求來過濾這些文章。
首先,我們介紹兩個基本功能—— byAuthor 和 byTag——基於作者和標籤來過濾文章。
BiFunction<String, List<Article>, List<Article>> byAuthor = (name, articles) -> articles.stream() .filter(a -> a.getAuthor().equals(name)) .collect(Collectors.toList()); BiFunction<String, List<Article>, List<Article>> byTag = (tag, articles) -> articles.stream() .filter(a -> a.getTags().contains(tag)) .collect(Collectors.toList());
兩個函式都是 BiFunction——意味著需要兩個引數。
byAuthor 接收作者名稱和文章列表兩個引數,返回根據作者過濾後的文章列表。
byTag 與此相同,接收標籤和文章列表兩個引數,返回根據標籤過濾後的文章列表。
由於 BiFunction 接收兩個引數,它只提供 andThen 函式。你不能將一個函式的結果放在一個接收兩個引數的函式中,因此沒有 compose 函式。
繼續,我們還有一個基本功能,需對文章列表從新到舊進行排序,並返回排序後的文章列表。
Function<List<Article>, List<Article>> sortByDate = articles -> articles.stream() .sorted((x, y) -> y.published().compareTo(x.published())) .collect(Collectors.toList()); Function<List<Article>, Optional<Article>> first = a -> a.stream().findFirst();
現在,我們已經有了基本的函式,現在看我們怎麼利用這些函式來組合成新的函式。
首先,我們組合一個返回最近發表的文章列表函式。
Function<List<Article>, Optional<Article>> newest = first.compose(sortByDate);
使用 first 這個函式以及我們之前建立的 sortByDate,我們能建立一個新的函式,該函式返回給定文章列表的最新文章。
我們可以繼續通過不同的方式混合這些函式,從而可以組合出不同意義的函式,而不需要重複寫程式碼。
找出作者的最新文章:
BiFunction<String, List<Article>, Optional<Article>> newestByAuthor = byAuthor.andThen(newest);
或者對某一作者的文章進行排序
BiFunction<String, List<Article>, List<Article>> byAuthorSorted = byAuthor.andThen(sortByDate);
或者你可能不關心作者,只想根據你喜歡標籤獲取最新的文章:
BiFunction<String, List<Article>, Optional<Article>> newestByTag = byTag.andThen(newest);
我想要表達的觀點是:通過 Function 介面及其組合功能,可以建立小的程式碼塊,再將其組合來滿足你的需求,這樣可以可以更簡單、更有意思地實現 DRY 原則。
就這樣了——利用 compose 和 andThen 來使用簡單的方式組合功能。你也試試吧!
相關文章
- JS 函式式概念: 管道 和 組合JS函式
- js的curry和函式組合JS函式
- JavaScript中的compose函式和pipe函式JavaScript函式
- 使用 useRequestURL 組合函式訪問請求URL函式
- 組合API-ref函式API函式
- 函式組合的 N 種模式函式模式
- (譯) JavaScript中的組合函式JavaScript函式
- JavaScript專題之函式組合JavaScript函式
- Python 函式(引數組合)Python函式
- 極簡設計模式-函式組合和集合管道模式設計模式函式
- Java 8 Function 函式介面JavaFunction函式
- [譯] 柯里化與函式組合函式
- java8特性-函式式介面Java函式
- java Stream結合函式方法Java函式
- 【Java】函式使用Java函式
- 第8課 使用函式函式
- 簡析JAVA8函式式介面Java函式
- 征服 JavaScript 面試:什麼是函式組合JavaScript面試函式
- 區間統計 聚合函式組合器函式
- Java 8怎麼了之二:函式和原語Java函式
- JavaScript 中的函數語言程式設計:函式,組合和柯里化JavaScript函數程式設計函式
- Java8之Stream-函式式介面Java函式
- 「Java8系列」神奇的函式式介面Java函式
- Java8的新特性--函式式介面Java函式
- java8 新特性之函式式介面Java函式
- 【博弈論】組合遊戲及SG函式淺析遊戲函式
- JavaScript函數語言程式設計(純函式、柯里化以及組合函式)JavaScript函數程式設計函式
- 第 8 節:函式-函式定義和引數函式
- PL/SQL單行函式和組函式詳解(轉)SQL函式
- 如何使用async和await這對組合設計統一的取Access Token的函式AI函式
- reduce與redux中compose函式Redux函式
- Java8新特性探索之函式式介面Java函式
- JavaScript函數語言程式設計,真香之組合函式(二)JavaScript函數程式設計函式
- Nuxt.js 錯誤偵探:useError 組合函式UXJSError函式
- Spark SQL scala和java版本的UDF函式使用SparkSQLJava函式
- java自定義equals函式和hashCode函式Java函式
- 函式組:SPO1/2/3/4/5/6/8函式
- 函式組: FREP函式