我有这个代码,我想使用Java 8使用函数样式进行重构。我想删除可变对象currentRequest并仍然返回已过滤的请求。
HttpRequest currentRequest = httpRequest;
for (Filter filter : filters) {
currentRequest = filter.doFilter(currentRequest);
}
目的是将请求传递给filter.doFilter方法,并获取输出并将其传递回filter.doFilter方法,并继续执行此操作,直到应用所有过滤器。
例如,以更复杂的方式进行for循环
HttpRequest filteredRequest1 = filters.get(0).doFilter(currentRequest);
HttpRequest filteredRequest2 = filters.get(1).doFilter(filteredRequest1);
HttpRequest filteredRequest3 = filters.get(2).doFilter(filteredRequest2);
...
我认为这是编写函数的情况,而doFilter方法应该是如下函数:
Function<HttpRequest, HttpRequest> applyFilter = request -> filters.get(0).doFilter(request);
但我知道这是完全错误的,因为我被困在这里。
我想的另一种方式是使用 reduce ,但在这种情况下我看不到使用它的方法。
如果你可以帮我解决这个问题,或者指出一些很棒的资源。
答案 0 :(得分:3)
看起来您可能想要http:
作为其身份reduce
。 reduce的每一步都将中间结果与下一个过滤器结合起来,如下所示:
HttpRequest
注意:如果使用并行流,则最后一个函数用于将两个filters.stream().reduce(currentRequest,
(req, filter) -> filter.doFilter(req),
(req1, req2) -> throwAnExceptionAsWeShouldntBeHere());
合并在一起。如果那是您想要的路线,那么请谨慎行事。
答案 1 :(得分:3)
这是一种流式处理过滤器并将每个过滤器映射到UnaryOperator<HttpRequest>
的方法。然后,所有函数都通过reduced运算符Function.andThen
,最后,如果filters
集合不为空,则使用currentRequest
执行生成的组合函数作为一个论点:
HttpRequest result = filters.stream()
.map(filter -> ((Function<HttpRequest, HttpRequest>) filter::doFilter))
.reduce(Function::andThen)
.map(function -> function.apply(currentRequest))
.orElse(currentRequest);