我有以下情况,其中我使用的 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/