Комментарии 12
Да можно скрестить ужа с ежом и получить колючую проволоку. Но действительно нафиг это надо в Java?
+1
То, что сам код лямбды не сериализуется (а только внутреннее имя и параметры), мне кажется совершенно нормальным. Ибо сериализация кода, весьма вероятно, может привести к куче проблем — как с безопасностью, так и с переносимостью. Кроме того, не знаю как в Java, но в Haxe можно сериализовать нечто в одной программе, а десериализовать в другой (понятно, что если сериализовались экземпляры классов, то во второй программе должны эти классы присутствовать). Поэтому в Haxe запрещена сериализация лямбд. Полагаю, что в Java будет такая же проблема — не получится выполнить десериализацию в другой программе, ибо лямбда там просто-напросто будет отсутствовать.
+1
В первую очередь, важно понимать, что лямбда-функция в Java всё-таки объект с одним методом, а не функция.
Строго говоря, объявленных методов может быть больше одного. Лямбда-функция в Java — это реализация функционального типа, а функциональный тип — любой интерфейс или абстрактный класс, у которых один метод объявлен как абстрактный (смотрим спеку (PDF), главы 9.8, 15.27).
То есть, если у нас есть класс, у которого реализовано n методов, но один — абстрактный, то его можно использовать как функциональный интерфейс, если у нас есть интерфейс с m методами и m-1 метод реализует поведение по умолчанию (default methods) — то это тоже функциональный интерфейс.
+2
Касательно абстрактного класса, я не уверен, что это так. Например, такой код:
У меня не собирается с ошибкой, что нужен интерфейс.
Но в остальном вы правы, сейчас исправлю.
public class Test {
public static abstract class Test1{
public abstract double get();
}
public static void main(String[] args) {
Test1 t = ()->2;
}
}
У меня не собирается с ошибкой, что нужен интерфейс.
Но в остальном вы правы, сейчас исправлю.
+1
Про абстрактный класс я был не прав. И да, вот есть ответ от Брайна Гетца (архитектор языка Java), почему было решено сделать так: http://mail.openjdk.java.net/pipermail/lambda-dev/2013-March/008441.html
+1
Лямбда-выражения в Java, как и зачем их сериализировать?Надо до ката сразу написать "Tl;dr: не делаете так".
0
> Сериализация лямбда-функций весьма представляет собой весьма интересный, но практически бесполезный механизм.
Как ни странно, но сериализация лямбд вполне успешно и с большой пользой применяется на практике. Например, на этом основана распределенная обработка данных в Apache Spark (см. spark.apache.org/docs/latest/programming-guide.html#passing-functions-to-spark).
Как ни странно, но сериализация лямбд вполне успешно и с большой пользой применяется на практике. Например, на этом основана распределенная обработка данных в Apache Spark (см. spark.apache.org/docs/latest/programming-guide.html#passing-functions-to-spark).
+2
Я вот разбирался с Apache Ignite, который бесплатный клон GridGain
И вижу там возможность выполнять лямбда код на удаленных нодах.
типа такого вот:
Ignite ignite = Ignition.ignite();
// Print out hello message on all cluster nodes.
ignite.compute().broadcast(() -> System.out.println(«Hello Node!»));
И вижу там возможность выполнять лямбда код на удаленных нодах.
типа такого вот:
Ignite ignite = Ignition.ignite();
// Print out hello message on all cluster nodes.
ignite.compute().broadcast(() -> System.out.println(«Hello Node!»));
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Лямбда-выражения в Java, как и зачем их сериализировать?