JavaFX, изменение объектов внутри лямбды

240
01 апреля 2018, 20:00

Есть такой слушатель на слайдер, но почему я не могу изменять(переприсваивать) переменные которые существуют вне функции?

mySlider.valueProperty().addListener((observable, oldValue,newValue) -> {
    myobj = something.getMyObj();            
});
Answer 1

Компилятор преобразовывает лямбды в анонимные классы. Эти классы могут менять поля объемлющего объекта или других объектов, на которые имеют ссылки. Но передаваемые в лямбды локальные переменные должны быть неизменяемыми, так как замыкания в Java эмулируются созданием в анонимном классе поля, захватывающего значение замыкаемой переменной. Убедиться в этом просто. Скомпилируем класс

public class Main {
    public static void main(String[] args) throws Exception {
        String value = "Test";
        Supplier<String> lambda = () -> value;
    }
}

и запустим с параметром -Djdk.internal.lambda.dumpProxyClasses=., чтобы Java сохранила сгенерированный анонимный класс. Заглянем внутрь этого класса

$ javap -p Main$$Lambda$1
final class Main$$Lambda$1 implements java.util.function.Supplier {
  private final java.lang.String arg$1;  // Захваченная переменная value
  private Main$$Lambda$1(java.lang.String);
  private static java.util.function.Supplier get$Lambda(java.lang.String);
  public java.lang.Object get();
}

Об этом можно почитать у Брайана Гетца в "State of the Lambda: Variable capture".

READ ALSO
Промотать до конца RecyclerView, когда нажал на edittext

Промотать до конца RecyclerView, когда нажал на edittext

Нужно, чтобы сообщения в RecyclerView были промотаны до конца, при нажатии на EditTextСейчас происходит по другому, когда раскрывается клавиатура,...

153
Как реализовать такой фильтр в DataTables

Как реализовать такой фильтр в DataTables

На сайте DataTables есть вот такая таблица https://datatablesnet/reference/type/, но я не вижу примеров как её сделать, есть аналоги примеров с кнопками, но они выполняют...

200
Не могу отловить checkbox через jquery

Не могу отловить checkbox через jquery

Всем привет!! Вообщем сложилась такая ситуация, есть список сотрудников и есть отделыВ каждом отделе сотрудников от 10 до 30, выбираешь отдел...

225