RFR [8037866] Replace the Fun class in tests with lambdas

Ivan Gerasimov ivan.gerasimov at oracle.com
Mon Jun 2 11:58:07 UTC 2014

Hi Remi!

On 02.06.2014 14:46, Remi Forax wrote:
> On 06/02/2014 06:36 AM, Martin Buchholz wrote:
>> Thanks!  Looks good.
>> There might be more common infrastructure to take advantage of later.
>> @FunctionalInterface is not really in the spirit of my super-compact
>> stylistically odd test code, but OK.
> Another question is why not to use a functional interface with one 
> parameter (Fun2?)
> or keep Fun and introduce Fun2.
>   //interface Fun {void f() throws Throwable;}
>   interface Fun2<T> {void f(T value) throws Throwable;}
> THROWS(BrokenBarrierException.class, barrier, x ->x.await(100, 
>   THROWS(IllegalStateException.class, it, Iterator::remove);
THROWS accepts an array of Funs.
Personally, I find more handy and less error-prone than providing pairs 
argument + lambda:
If we have only one pair, we'll need to repeat THROWS several times,
If we accept even-sized array, it can be messed up.

> with the nice advantage that most of the time the lambda will be constant
> (a lambda that's not capture value from the outer context).
In case it's needed, some helper class that transforms Fun2 into Fun 
could be used:

class Fun2Impl<T> implements Fun {
     final T val;
     Fun2<T> fun2;
     public Fun2Impl(T val, Fun2<T> fun2) { this.val = val; this.fun2 = 
fun2; }
     public void f() { fun2.f(val); }


THROWS(BrokenBarrierException.class, new Fun2Impl(barrier, x 
->x.await(100, MILISECOND)));
THROWS(IllegalStateException.class, new Fun2Impl(it, Iterator::remove));

It can be slightly beautified, of course.
However, I don't think there would be much use of it, as it can already 
be achieved through Fun, making 'x' and 'it' final.

Sincerely yours,

> Rémi
>> On Sun, Jun 1, 2014 at 5:57 PM, Ivan Gerasimov 
>> <ivan.gerasimov at oracle.com>
>> wrote:
>>> Hello!
>>> Would you please help review the fix, which replaces the auxiliary Fun
>>> class with the same named functional interface?
>>> The anonymous classes instantiations are replaced with lambdas.
>>> BUGURL: https://bugs.openjdk.java.net/browse/JDK-8037866
>>> WEBREV: http://cr.openjdk.java.net/~igerasim/8037866/0/webrev/
>>> Sincerely yours,
>>> Ivan

More information about the core-libs-dev mailing list