Допустим, что есть интерфейс:
interface I<T> { public T m(T value); }и есть реализация этого интерфейса:
Io = new I<Integer>() { @Override public Integer m(Integer value) { return value++; } };
IDEA подсветила выражение, предложив использовать лямбды. После чего, рефакторинг в одно нажатие изменил код так:
I<Integer> l = value -> value++;
А теперь допустим, что в одном и том же методе существуют обе эти реализации. Как вы думаете, какие числа напечатаются?
System.out.println(o.m(1)); System.out.println(l.m(1));
Welcome to λ-hell!
Ну, чё, круто.
ОтветитьУдалитьХотя тест синтетический, так как выражение return value++; не несет смысла, но забавно.
Похоже на багу, так как это выражение так же выдает то же самое:
I m = value -> {return value++; };
sout(m.m(1));
Что еще забавно, IDEA странно выдает предупреждения по первому и третьему варианту (показаны в IDEA одинаково):
ОтветитьУдалитьВ первом варианте value++; подсвечено, как неипользуемая переменная, а в лямбда-варианте с блоком подсвечено, что return лишний и можно записать без блоков.