成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java 8:使用compose和andThen組合函數

開發 后端
本文這些利用 compose 和 andThen 來使用簡單的方式組合功能,你也試試吧!

在這篇文章中,我將討論利用 Function 接口提供的兩個組合函數—— compose 和 andThen 來實現函數的組合。

什么是函數組合?

首先需要創建一些小的可重用函數,然后將這些小函數組合為新函數。

現在,我們怎么利用 compose 和 andThen 方法來完成函數的組合?

首先,定義兩個簡單的函數—— times2 和 squared。

  1. Function<Integer, Integer> times2 = e -> e * 2
  2. Function<Integer, Integer> squared = e -> e * e; 

接下來,使用 compose 和 andThen 將它們連起來。

 

  1. times2.compose(squared).apply(4);  
  2. // Returns 32 
  3. times2.andThen(squared).apply(4);  
  4. // Returns 64 

如你所見,compose 和 andThen 的不同之處是函數執行的順序不同。compose 函數先執行參數,然后執行調用者,而 andThen 先執行調用者,然后再執行參數。

我們開始組合函數

我們先創建一個示例,演示如何利用這種方式創建可重用的小代碼片段——然后我們以不同的方式組合這些代碼片段。

考慮下面的問題。

有一個文章列表,現在需要根據不同的需求來過濾這些文章。

首先,我們介紹兩個基本功能—— byAuthor 和 byTag——基于作者和標簽來過濾文章。

  1. BiFunction<String, List<Article>, List<Article>> byAuthor = 
  2.     (name, articles) -> articles.stream() 
  3.         .filter(a -> a.getAuthor().equals(name)) 
  4.         .collect(Collectors.toList()); 
  5. BiFunction<String, List<Article>, List<Article>> byTag =  
  6.     (tag, articles) -> articles.stream() 
  7.         .filter(a -> a.getTags().contains(tag)) 
  8.         .collect(Collectors.toList()); 

兩個函數都是 BiFunction——意味著需要兩個參數。

byAuthor 接收作者名稱和文章列表兩個參數,返回根據作者過濾后的文章列表。

byTag 與此相同,接收標簽和文章列表兩個參數,返回根據標簽過濾后的文章列表。

由于 BiFunction 接收兩個參數,它只提供 andThen 函數。你不能將一個函數的結果放在一個接收兩個參數的函數中,因此沒有 compose 函數。

繼續,我們還有一個基本功能,需對文章列表從新到舊進行排序,并返回排序后的文章列表。

  1. Function<List<Article>, List<Article>> sortByDate =  
  2.     articles -> articles.stream() 
  3.         .sorted((x, y) -> y.published().compareTo(x.published())) 
  4.         .collect(Collectors.toList()); 
  5. Function<List<Article>, Optional<Article>> first =  
  6.     a -> a.stream().findFirst(); 

現在,我們已經有了基本的函數,現在看我們怎么利用這些函數來組合成新的函數。

首先,我們組合一個返回最近發表的文章列表函數。

  1. Function<List<Article>, Optional<Article>> newest =  
  2.     first.compose(sortByDate); 

使用 first 這個函數以及我們之前創建的 sortByDate,我們能創建一個新的函數,該函數返回給定文章列表的***文章。

我們可以繼續通過不同的方式混合這些函數,從而可以組合出不同意義的函數,而不需要重復寫代碼。

找出作者的***文章:

  1. BiFunction<String, List<Article>, Optional<Article>> newestByAuthor =  
  2.     byAuthor.andThen(newest); 

或者對某一作者的文章進行排序

  1. BiFunction<String, List<Article>, List<Article>> byAuthorSorted =  
  2.     byAuthor.andThen(sortByDate); 

或者你可能不關心作者,只想根據你喜歡標簽獲取***的文章:

  1. BiFunction<String, List<Article>, Optional<Article>> newestByTag =  
  2.     byTag.andThen(newest); 

我想要表達的觀點是:通過 Function 接口及其組合功能,可以創建小的代碼塊,再將其組合來滿足你的需求,這樣可以可以更簡單、更有意思地實現 DRY 原則。

就這樣了——利用 compose 和 andThen 來使用簡單的方式組合功能。你也試試吧!

 

 

責任編輯:王雪燕 來源: ImportNew
相關推薦

2011-10-19 15:47:13

2021-04-19 15:35:13

NumPy組合數組

2022-03-29 09:15:55

Javascript函數屬性

2015-09-28 14:54:08

Java函數式編程

2020-09-23 16:07:52

JavaScript函數柯里化

2010-04-28 16:45:27

Oracle Inst

2009-07-08 16:10:24

Scala簡介面向對象函數式

2021-08-03 07:51:43

Java 8 函數接口

2015-09-30 09:34:09

java8字母序列

2022-11-28 16:04:16

2023-07-26 07:13:55

函數接口Java 8

2025-05-19 00:02:45

SQL窗口函數

2010-09-09 09:31:19

SQL函數left

2017-05-23 15:53:52

docker服務容器

2019-09-17 08:00:24

DockerCompose命令

2023-11-02 08:45:07

2010-05-18 14:59:05

EnterpriseD

2009-11-16 16:59:03

PHP構造函數

2010-09-02 15:45:18

PHP函數echo

2009-07-22 09:02:45

Scala組合繼承
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线观看中文视频 | 99精品一区二区 | 视频一区在线观看 | 天天插天天射天天干 | 毛片一区二区三区 | 99精品视频在线观看 | 中文字幕一区二区三区四区不卡 | 中文字幕一区二区在线观看 | 日韩国产黄色片 | 日韩精品免费一区二区在线观看 | 国产高清一区二区三区 | 成人午夜电影在线观看 | 色综合久久天天综合网 | 综合久久一区 | 国产乱一区二区三区视频 | 午夜影院普通用户体验区 | 亚洲精视频 | 欧美亚洲国产成人 | 天天干夜夜操视频 | 色综合一区二区 | 欧美日韩精品在线免费观看 | 日韩欧美精品一区 | av天天干 | 精品久久久久久亚洲综合网站 | 国产精品高潮呻吟久久久久 | 五月综合久久 | 亚洲一区中文字幕 | 精品国产1区2区3区 在线国产视频 | av在线播放国产 | 日韩一区二 | 国产精品久久久久久久久久 | 日韩免费av | 久久久高清 | 91电影| 欧美黑人一级爽快片淫片高清 | 二区av | 久久久久久免费毛片精品 | 亚洲视频区 | www一级片| 久久国产日韩欧美 | 中文字幕国产 |