can*_*ani 5 java refactoring functional-programming
我有这个代码,我想使用Java 8使用函数样式进行重构.我想删除可变对象currentRequest并仍然返回已过滤的请求.
HttpRequest currentRequest = httpRequest;
for (Filter filter : filters) {
currentRequest = filter.doFilter(currentRequest);
}
Run Code Online (Sandbox Code Playgroud)
目的是将请求传递给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);
...
Run Code Online (Sandbox Code Playgroud)
我认为这是组合函数的一种情况,doFilter方法应该是如下函数:
Function<HttpRequest, HttpRequest> applyFilter = request -> filters.get(0).doFilter(request);
Run Code Online (Sandbox Code Playgroud)
但我知道这是完全错误的,因为我被困在这里.
我想的另一种方法是使用reduce,但在这种情况下我看不到使用它的方法.
如果你可以帮我解决这个问题,或者指出一些非常好的资源.
看起来您可能想要以reduce
您的HttpRequest
身份进行操作。减少的每一步都会将中间结果与下一个过滤器结合起来,如下所示:
filters.stream().reduce(currentRequest,
(req, filter) -> filter.doFilter(req),
(req1, req2) -> throwAnExceptionAsWeShouldntBeHere());
Run Code Online (Sandbox Code Playgroud)
HttpRequests
注意:如果使用并行流,最后一个函数用于将两个函数合并在一起。如果您想走那条路,请小心行事。