OpenJFX Lambda Day, Feb 25th 2014

anton nashatyrev anton.nashatyrev at oracle.com
Tue Feb 18 09:25:32 PST 2014


Hello All,

     I'd like to add my 2 cents to lambdafication of JavaFX:

     Recently I was working on a fix in the JFX and used convenient JFX 
beans feature - 'select binding':

javafx.beans.binding.Bindings.select*(ObservableValue<?> root, 
java.lang.String... steps)

     I.e. to select some chain of properties one should write something 
like:

BooleanBinding bb = Bindings.selectBoolean(control.sceneProperty(), 
"window", "isShowing");

     When having templates and lambdas this API looks legacy. This kind 
of usage is not type-safe, may lead to runtime errors and involves 
reflection in the implementation.

     The idea is to use type-safe functional-style 'selector' like this:

@FunctionalInterface
public interface Selector<T, E> {
      ObservableValue<E> selectValue(T t);
}

     and the helper interface (class):

public interface SelectElement<E> {
      <K> SelectElement<K> select(Selector<E, K> p);

      <K extends Boolean> BooleanBinding selectBoolean(Selector<E, K> p);
      <K extends Integer> IntegerBinding selectInteger(Selector<E, K> p);
      <K extends Long>    LongBinding selectLong(Selector<E, K> p);
      <K extends Float>   FloatBinding selectFloat(Selector<E, K> p);
      <K extends Double>  DoubleBinding selectDouble(Selector<E, K> p);
      <K extends String>  StringBinding selectString(Selector<E, K> p);
      <K>                 ObjectBinding selectObject(Selector<E, K> p);

}

     The new Bindings method replacing all select*() methods:

     publci static <E> SelectElement<E> select(ObservableValue<E> o);

     With the new API the example above would look like:

BooleanBinding bb = Bindings.select(control.sceneProperty()).
         select(s -> s.windowProperty()).
         selectBoolean(w -> w.showingProperty());

     The benefits of the new API:

  * Static type checking - no chances for a mistake when selecting long
    chain of properties
  * IDE code assisting for property selection
  * not restricted to properties only, but might be used with any
    observable. I.e. one may want to select an element from observable
    collection at any selection step
  * might be implemented without reflection, which may result in some
    performance gain

This change is of course might be targeted to JDK9 only.

Thanks for taking a look!
Anton.


On 15.02.2014 3:35, Stephen F Northover wrote:
> Hello all,
>
> Mark it on your calendar.  Feb 25th is OpenJFX Lambda day.  On that 
> day, we will lock the code base, lambdify everything in sight, and 
> then open up for business again.  One thing that we won't be doing 
> right away is converting our code to use streams and other JDK8 
> features but this is inevitable (perhaps after 8u20).  We are part of 
> the JDK, we ship with the JDK so we will use features from the JDK.
>
> Like "Lambda's to the slaughter" the Android and iOS ports of OpenJFX 
> will be affected.  We've been discussing the use of RetroLambda on and 
> off in JIRA for a while and it seems that it will work for both 
> ports.  We care about these ports and it is possible that Lambda Day 
> will slip for one reason or another.  For one thing, the lambdifying 
> tools blow up some of the source making lambda conversion a somewhat 
> manual process.  Hopefully we can get the bugs fixed before the day.
>
> On that day, I will be listening to 'The Lambda Lies Down on Broadway" 
> all day.  Those of you with children might prefer "Mary had a little 
> Lambda".  Despite being called "The Lambda Police", I am and old 
> Lisper and a card carrying member of the "Knights of the Lambda 
> Calculus".  Look that one up.  I know the founder personally but will 
> never tell who it is.
>
> Steve
>
>



More information about the openjfx-dev mailing list