java - 用于替换嵌套 for 循环的 Lambda 表达式由于某种原因不起作用

标签 java lambda java-8 java-stream

我有以下情况,其中我使用的 lambda 表达式 替换工作 for 循环不起作用。不知道为什么会这样 失败

public class Abc implements IAbc {

    // some fields
    ...
    // field i'm interested in
    @Inject @Any
    private Instance<HandlerInterface> handlers;

    // more members
    ...
    // method i'm interested in
    @Override
    public boolean hasHandler(List<Order> orders) {
        for (Order anOrder : orders) {
            for (HandlerInterface aHandler : handlers) {
                // following canHandler() is implemented by each 
                // handler that implements the HandlerInterface
                if(aHandler.canHandle(anOrder)) {
                    return true;
                }
            }
        return false;
    }
    // rest of the class content
    .....
}

所以我实际上试图在方法中替换上面的代码, 与 Lambdas(我是新手)。以下是我的替换代码

public boolean hasHandler(List<Order> orders) {
    return orders.stream().anyMatch(order ->
        Stream.of(handlers).map(Provider::get).anyMatch(handler ->
            handler.canHandle(order)));
}

上面的 lambda 表达式在 handler.canHandle 处失败 模糊解决异常。我不明白为什么它与 for 循环而不是流。我确信我在这里做错了什么 - 但不知道是什么。非常感谢对此的任何帮助。

最佳答案

我假设 Instance<HandlerInterface>实现Iterable<HandlerInterface> (否则您将无法在增强的 for 循环中使用它)。

这意味着您可以创建 Stream这个 Iterable 的元素通过调用 StreamSupport.stream(handlers.spliterator(), false);

现在,您的方法可以转换为使用 Streams,如下所示:

public boolean hasHandler(List<Order> orders) {
    return orders.stream()
                 .anyMatch(o -> StreamSupport.stream(handlers.spliterator(), false)
                                             .anyMatch(h -> h.canHandle(o)));
}

注意:我删除了 .map(Provider::get)步骤,因为它在原始嵌套循环代码中没有相应的步骤。

关于java - 用于替换嵌套 for 循环的 Lambda 表达式由于某种原因不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50169248/

相关文章:

c# - 将 lambda 表达式作为方法参数传递

java - @DateTimeFormat 转换为 JSON 格式错误

java - 如何制作 Stream 的副本,以便在使用它时使用 Java 8 中的副本?

java - Hibernate,不支持嵌套事务

java - 如何同时运行两个不同的主类?

c++ - Lambda 函数作为参数传递

c# - IEnumerable Group 按用户指定的动态键列表

java - ApplicationContext 事件从未被抛出

java - 如何使用 fillPolygon 转换正方形

java - 为每个记录器添加处理程序