My lambda leftovers
Tagir Valeev
amaembo at gmail.com
Fri Oct 6 11:51:26 UTC 2017
Hello!
As for throw, I think it should just be converted to an expression,
probably of the same type as a null literal (thus throw statement will
become an expression statement). In this case it could be useful not
only in lambdas, like:
return list.isEmpty() ? throw new NoSuchElementException() : list.get(0);
I believe, it was discussed in context of pattern matching.
With best regards,
Tagir Valeev.
On Fri, Oct 6, 2017 at 6:16 PM, Remi Forax <forax at univ-mlv.fr> wrote:
> Hi all,
> The JEP 302 list some improvements but I think some are missing, obviously, it's up to debate :)
>
> So here is my list of left leftovers:
> - support throw statement as a lambda expression
>
> I think we have already discussed informally about this one.
> The compiler should allow to have a lambda expression that starts with throw.
>
> so a code like this will become valid
> merge(key, value, (_, _) -> throw new IllegalStateException("key " + key + " already present));
>
>
> - allow void to be converted to Void (by returning null)
>
> This proposal is perhaps more controversial, currently there is no way to simply convert a lambda statement to a lambda expression.
> So a code like will compile
>
> <T, R> R sync(T initial, Function<? super T, ? extends R> fun) {
> synchronized(lock) {
> return fun.apply(initial);
> }
> }
>
> Consumer<String> c = System.out::println;
> sync("foo", c::accept); // the compiler should generate a synthetic static method that returns null
>
> This proposal is problematic because:
> - it implicitly produces a null, which is a bad idea
> - if there are several overloads, a lambda statement can now match more methods so the compiler may reject code that was previously working or worst call another method that the one that was originally selected.
>
>
> The other question is should the conversion be extended to work with non lambda code,
> i.e. consider that 'return' or an implcit 'return' can be trasformed to a return null by the compiler.
>
> Void m() {
> return; // the compiler generates return null;
> }
>
> Void m() { } // the compiler generates return null;
>
>
> On the positive side, it mix well with the switch expression proposed in the Pattern Matching JEP.
>
> Supplier<Void> supplier =
> () -> switchexpr(someValue) {
> case 0 -> System.out.println("foo");
> default -> { /* empty */ }
> };
>
>
> regards,
> Rémi
>
> [1] http://openjdk.java.net/jeps/302
More information about the amber-spec-experts
mailing list