JAVA 8将返回值传回同一方法x次

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA 8将返回值传回同一方法x次相关的知识,希望对你有一定的参考价值。

我有这个代码,我想使用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,但在这种情况下我看不到使用它的方法。

如果你可以帮我解决这个问题,或者指出一些非常好的资源。

答案

看起来你可能想用你的reduce做一个HttpRequest身份。 reduce的每一步都会将中间结果与下一个过滤器结合起来,如下所示:

filters.stream().reduce(currentRequest,
                        (req, filter) -> filter.doFilter(req),
                        (req1, req2) -> throwAnExceptionAsWeShouldntBeHere());

注意:如果使用并行流,则最后一个函数用于将两个HttpRequests合并在一起。如果那是你想要的路线,那么请谨慎行事。

另一答案

这是一种流式传输过滤器并将每个过滤器映射到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);

以上是关于JAVA 8将返回值传回同一方法x次的主要内容,如果未能解决你的问题,请参考以下文章

java ----一个函数传回多个值的总结

将数据从当前片段传回前一个片段

java ee 8

JDK1.8源码阅读-java.lang.Object.java

java 循环变量

Method