Как стать автором
Обновить

Комментарии 12

Да можно скрестить ужа с ежом и получить колючую проволоку. Но действительно нафиг это надо в Java?
Это вы про сериализацю лямбда-выражений или про лямбда-выражения в Java вообще?
То, что сам код лямбды не сериализуется (а только внутреннее имя и параметры), мне кажется совершенно нормальным. Ибо сериализация кода, весьма вероятно, может привести к куче проблем — как с безопасностью, так и с переносимостью. Кроме того, не знаю как в Java, но в Haxe можно сериализовать нечто в одной программе, а десериализовать в другой (понятно, что если сериализовались экземпляры классов, то во второй программе должны эти классы присутствовать). Поэтому в Haxe запрещена сериализация лямбд. Полагаю, что в Java будет такая же проблема — не получится выполнить десериализацию в другой программе, ибо лямбда там просто-напросто будет отсутствовать.
Возможо, если засунуть в другую программу класс из первой. Но в обычном случае получится NoSuchClassException.
В первую очередь, важно понимать, что лямбда-функция в Java всё-таки объект с одним методом, а не функция.

Строго говоря, объявленных методов может быть больше одного. Лямбда-функция в Java — это реализация функционального типа, а функциональный тип — любой интерфейс или абстрактный класс, у которых один метод объявлен как абстрактный (смотрим спеку (PDF), главы 9.8, 15.27).

То есть, если у нас есть класс, у которого реализовано n методов, но один — абстрактный, то его можно использовать как функциональный интерфейс, если у нас есть интерфейс с m методами и m-1 метод реализует поведение по умолчанию (default methods) — то это тоже функциональный интерфейс.
Касательно абстрактного класса, я не уверен, что это так. Например, такой код:
public class Test {
    public static abstract class Test1{
        public abstract double get();
    }
    public static void main(String[] args) {
        Test1 t = ()->2;
    }
}

У меня не собирается с ошибкой, что нужен интерфейс.
Но в остальном вы правы, сейчас исправлю.
Лямбда-выражения в Java, как и зачем их сериализировать?
Надо до ката сразу написать "Tl;dr: не делаете так".
> Сериализация лямбда-функций весьма представляет собой весьма интересный, но практически бесполезный механизм.

Как ни странно, но сериализация лямбд вполне успешно и с большой пользой применяется на практике. Например, на этом основана распределенная обработка данных в Apache Spark (см. spark.apache.org/docs/latest/programming-guide.html#passing-functions-to-spark).
Это красиво, но потенциально небезопасно. Очень легко «захватить» с собой весь внешний объект со всем поддеревом, только лишь упомянув одно его поле в лямбде.
Да, есть такая проблема. В Scala ее пытаются решить с помощью макросов: github.com/heathermiller/spores
Я вот разбирался с Apache Ignite, который бесплатный клон GridGain
И вижу там возможность выполнять лямбда код на удаленных нодах.
типа такого вот:

Ignite ignite = Ignition.ignite();
// Print out hello message on all cluster nodes.
ignite.compute().broadcast(() -> System.out.println(«Hello Node!»));
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории