Lambda is a new feature in Open JDK 8.  Could you give some
explanation about Lambda and FunctionalInterface annotation usage in
AWT/Swing?

   Here are some statements that can be correct or not (I am not an
expert in JDK lambda):

   1. It is good practice to use Lambda for the AWT/Swing listeners:
          button.addActionListener(e -> ui.dazzle(e.getModifiers()));
       http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-4.html

Generally yes. In cases where a lambda is a possibility, you still have a choice of a lambda or an inner class. The benefit of using a lambda is inversely proportional to the code size of the body. So for a one liner, you get your biggest syntactic payback. Lambdas also have some performance advantages; their worst case performance equals inner classes best case performance.

    2. Adding  FunctionalInterface annotation allows the compiler to
check that the interface has only one abstract method.

Correct. It also captures and documents your INTENT that this is a type suitable as a lambda target type.

       However, all works in the same way if an interface does not have
the FunctionalInterface annotation.

Correct. The compiler does not use @FI to determine target type compatibility.

   3. Users should care about Swing classes usage in Lambda methods
invoked in in parallel because Swing classes should be updated from ETD.

Here, lambdas are exactly the same story as inner classes. A lambda expression evaluates to an object of a given functional interface type; no threads involved. And the APIs we are introducing in Java SE 8 do not introduce any additional non-explicit concurrency or parallelism. If you *ask* for parallelism, you'll get it, but if you simply say

  collection.forEach(e -> System.out.println(e));

the forEach loop will invoke the lambdas sequentially in the current thread.

   May be something else that could give better understanding of the
Lambda features usage in AWT/Swing and how Swing should be adopted for
the Lambda?

The primary benefits will be:
- decreased capture cost (lambda capture is often cheaper than inner class capture)
 - More readable code

These benefits in turn enable API designers to design APIs that have finer-grained interactions between the client and library. For example, with lambdas, SwingWorker might have been practical to write as a method instead of a class.

Reply via email to