В документе проекта lambda: Состояние лямбда v4
В разделе 7. Захват переменной. Упоминается, что ....
Мы намерены запретить захват изменяемых локальных переменных. Причина в том, что подобные идиомы:
int sum = 0; list.forEach(e -> { sum += e.size(); });
являются принципиально серийными; довольно сложно писать лямбда-тела, подобные этому, которые не имеют условий гонки. Если мы не хотим принуждать - желательно во время компиляции - чтобы такая функция не могла выйти из своей захватывающей нити, эта функция может вызвать больше проблем, чем она решает.
Изменить:
Еще одна вещь, которую следует отметить здесь: локальные переменные передаются в конструкторе внутреннего класса при доступе к ним внутри вашего внутреннего класса, и это не будет работать с не окончательной переменной, так как значение не конечных переменных может быть изменено после построения .
В то время как в случае переменной экземпляра компилятор передает ссылку класса и класса, ссылка будет использоваться для доступа к переменной экземпляра. Таким образом, это не требуется в случае переменных экземпляра.
PS: Следует отметить, что анонимные классы могут получить доступ только к конечным локальным переменным (в JAVA SE 7), тогда как в Java SE 8 вы можете эффективно конечные переменные также внутри лямбда, а также внутренние классы.
Проблема в том, что обработчик намерений ожидает, что вы вернете Обещание, если вы выполняете какие-либо асинхронные функции - например, доступ к базе данных. Самый простой способ сделать это - перейти от использования обратных вызовов с MongoDB к использованию версий функций, возвращающих Promises, а затем вернуть обещание.
Я не проверял, но что-то вроде этого может сработать
return MongoClient.connect( uri )
.then( client => {
const collection = client.db("test").collection("data");
return collection.find({fname: 'Example'}).toArray();
})
.then( result => {
let name = result[0].lname;
agent.add("Found last name: "+name);
});