我有这个代码,我想使用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,但在这种情况下我看不到使用它的方法.
如果你可以帮我解决这个问题,或者指出一些非常好的资源.
我正在考虑使用比较器整理出一个列表列表(在 ArrayLists 上)。订单最大的地方。所有子列表将始终具有相同的大小。
例如,一个列表
[[4,5,6], [7,9,10], [4,7,8], [1,2,3], [7,9,12]]
Run Code Online (Sandbox Code Playgroud)
这应该
[[7,9,12], [7,9,10], [4,7,8], [4,5,6], [1,2,3]]
Run Code Online (Sandbox Code Playgroud)
我有这样的东西,但只按每个列表中的第一项排序
List<List<Integer>> list = Arrays.asList(
Arrays.asList(4,5,6),
Arrays.asList(7,9,10),
Arrays.asList(4,7,8),
Arrays.asList(1,2,3),
Arrays.asList(7,9,12));
list.sort((l1, l2) -> l2.get(0).compareTo(l1.get(0)));
Run Code Online (Sandbox Code Playgroud)
其中产生:
[[7, 9, 10], [7, 9, 12], [4, 5, 6], [4, 7, 8], [1, 2, 3]]
Run Code Online (Sandbox Code Playgroud)
如何编写比较器,如果前一项相等,则按列表中的下一项进行排序?
例如,[7, 9, 10], [7, 9, 12] 应该继续比较两个 7,然后是两个 9,然后是 10 和 12。例如,[4, 5, 6], [4, 7, 8] 应该继续比较两个 4,然后 4 和 7 并停止。