当前位置: 首页 > 科技观察

Java8:使用compose和andThen组合函数

时间:2023-03-12 22:20:45 科技观察

在这篇文章中,我将讨论使用Function接口提供的两个组合函数——compose和andThen来组合函数。什么是函数组合?你首先需要创建一些可重用的小函数,然后将这些小函数组合成新的函数。现在,我们如何使用compose和andThen方法组合函数?首先,定义两个简单的函数——times2和squared。Functiontimes2=e->e*2;Functionsquared=e->e*e;接下来,使用compose和andThen将它们连接起来。times2.compose(squared).apply(4);//返回32times2.andThen(squared).apply(4);//返回64正如你所见,compose和andThen的区别在于函数执行的顺序。compose函数首先执行参数,然后执行调用者,而andThen先执行调用者,然后执行参数。让我们从组合函数开始让我们创建一个示例,说明如何使用它来创建小的可重用代码片段——然后我们将以不同的方式组合这些代码片段。考虑以下问题。有一个文章列表,现在我们需要根据不同的需求来过滤这些文章。首先,我们介绍两个基本函数-byAuthor和byTag-根据作者和标签过滤文章。BiFunction,List

>byAuthor=(name,articles)->articles.stream().filter(a->a.getAuthor().equals(name)).collect(Collectors.toList());BiFunction,List
>byTag=(tag,articles)->articles.stream().filter(a->a.getTags().contains(tag)).collect(Collectors.toList());这两个函数都是BiFunctions-这意味着需要两个参数。byAuthor接收两个参数:作者姓名和文章列表,返回按作者过滤后的文章列表。byTag和这个一样,它接收标签和文章列表两个参数,返回一个根据标签过滤的文章列表。由于BiFunction有两个参数,它只提供了andThen函数。您不能将函数的结果放在带有两个参数的函数中,因此缺少compose函数。继续,我们还有一个基本函数,需要将文章列表从最新到最旧排序,并返回排序后的文章列表。Function,List
>sortByDate=articles->articles.stream().sorted((x,y)->y.published().compareTo(x.published())).collect(Collectors.toList());Function,Optional
>first=a->a.stream().findFirst();现在我们有了基本函数,让我们看看如何使用它们来组合新函数。首先,我们将一个函数放在一起,返回最近发表的文章列表。Function,Optional
>newest=first.compose(sortByDate);使用我们之前创建的第一个函数和sortByDate,我们可以创建一个新函数,该函数返回给定文章列表*article的**。我们可以继续以不同的方式混合这些函数,这样就可以在不重复代码的情况下将具有不同含义的函数组合起来。查找作者最新文章:BiFunction,Optional
>newestByAuthor=byAuthor.andThen(newest);或者对某个作者的文章进行排序BiFunction,List
>byAuthorSorted=byAuthor.andThen(sortByDate);或者你可能不关心作者,只想根据你喜欢的标签获取最新的文章:BiFunction,Optional
>newestByTag=byTag.andThen(newest);我想表达的观点是:通过Function接口和它的组合函数,你可以创建小的代码块,然后组合它们来满足你的需求,这样可以更简单,更有趣。干燥原则。就是这样-使用compose和andThen以简单的方式组合功能。试试看!