 <p>How about using an anonymous inner class instead of a lambda expression?</p> <pre><code>IntegerProperty property = new SimpleIntegerProperty(); InvalidationListener listener = new InvalidationListener() { @Override public void invalidated(Observable observable) { //TODO do something property.removeListener(this); } }; property.addListener(listener); </code></pre> <p>The answer was partly in the comments so I'll add my [brian] solution here.</p> <pre><code>public void someMethod(){ for(Spec spec : specs){ spec.myProperty().addListener(listener); } } ChangeListener&lt;Number&gt; listener = new ChangeListener&lt;Number&gt;() { public void changed(ObservableValue&lt;? extends Number&gt; obs, Number ov, Number nv) { Spec spec = (Spec)((SimpleLongProperty)obs).getBean(); spec.myProperty().removeListener(this); } }; </code></pre> <p>Note, when I create myProperty in the Spec class I use the full constructor to specify the bean. <code>new SimpleLongProperty(this, "myProperty", 0l);</code></p> <p>Even doing this you still can't use a lambda to remove <code>this</code>.</p>