Итак, это решило эту проблему:
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
...
static Logger root = (Logger) LoggerFactory
.getLogger(Logger.ROOT_LOGGER_NAME);
static {
root.setLevel(Level.INFO);
}
Вы можете установить Level
на более высокий Level
, если вы хотите скрыть все журналы.
Замыкания позволяют моделировать поведение, инкапсулируя и код, и контекст в одну конструкцию.
Ключевая концепция заключается в том, что код вашей функции (лямбда) может ссылаться не только на свои собственные переменные, но также на все, что не видно для кода, переменные a
и b
в вашем случае.
В Java замыкания могут ссылаться только на конечные или эффективно конечные переменные. Это означает, что ссылка на переменную не может быть изменена, и замыкание видит только фактическое неизменяемое состояние (значение на самом деле не является неизменным, окончательное означает, что переменная не может быть переназначена). В теории это не обязательно. Например, в JavaScript вы можете написать такой код:
function newCounter() {
let count = 0;
return function() { return ++count; };
}
const nc = newCounter();
console.log(nc()); // 1
console.log(nc()); // 2
console.log(nc()); // 3
Здесь внутренняя функция newCounter
по-прежнему имеет доступ к count
(его контекст) и может изменять его (переменная является изменяемой) .
Обратите внимание, что переменная counter
недоступна для любых других частей вашего кода за пределами замыкания.
Замыкания позволяют вам обращаться к переменным в их внешних областях. Внешняя переменная области видимости в этом случае (b) объявляется как то, что Java-сообщество теперь называет фактически финальным, то есть ее значение не изменяется с момента инициализации (int b = 20) Чтобы быть доступным.
Имейте в виду, что переменные должны быть объявлены как окончательные или эффективно окончательные, чтобы это работало как замыкания.
Теперь, что касается вашего кода, этот код объявляет метод doProcess (...) , который возвращает метод для частичного выполнения метода doProcess (...) .
Метод process (...) обращается к b во внешней области видимости метода doProcess (...) , который объявлено окончательно окончательным.