C# для разработчика Java (серия из 4 частей)
Лямбда – это анонимная функция, которая может быть назначена переменной, передана в качестве аргумента метода и вызвана в любое время. Мы можем найти лямбды в Java и C#, и полученный код очень похож. Лямбда-код Java можно рассматривать как реализацию интерфейса только с одним методом (называемым функциональным интерфейсом ), тогда как лямбда-код C# может быть назначен делегату
, что является концепцией, которой не существует в Java. Цель этой статьи – объяснить, как лямбды работают в Java и C#, и подчеркнуть их различия и сходства.
Функциональные интерфейсы Java
В Java лямбда-выражение можно просто рассматривать как анонимную функцию, реализующую интерфейс только с одним методом. Этот тип интерфейса называется функциональным интерфейсом и может быть снабжен аннотацией @FunctionalInterface
, которая указывает компилятору применять правило только одного метода:
@FunctionalInterface interface Printer { void print(String message); }
// The function interface is implemented with a lambda Printer standardPrinter = message -> System.out.println(message); // The print method of standardPrinter can be invoked standardPrinter.print("Hello World!");
Из предыдущего фрагмента вы должны отметить, что способ реализации интерфейса не имеет абсолютно никакого значения. Это может быть лямбда, конкретный класс или даже анонимный класс. В любом случае, вы можете просто вызвать метод print
интерфейса.
В JDK есть некоторые предопределенные общие функциональные интерфейсы , которые можно использовать непосредственно с полки. Основные из них описаны ниже:
Функция | Принимает аргумент заданного типа T и возвращает объект типа R | R применить (T t) |
Потребитель | Принимает аргумент заданного типа T и делает что-то полезное (обычно с побочными эффектами) | признание недействительным (T) |
Сказуемое | Принимает аргумент заданного типа T и возвращает логическое значение (аналогично функции) | логический тест(T) |
Поставщик | Возвращает объект типа T | T получить() |
Делегаты C#
INC#, лямбда-выражение может быть назначено делегату, который является типом, инкапсулирующим метод:
delegate void Print(string message);
// A lambda is assigned to the delegate Print print = message => System.Console.WriteLine(message); // print can be directly invoked as a method print("Hello World!");
Как и в Java, некоторые делегаты уже определены в.Сетевая структура, основные из которых описаны ниже:
Принимает аргумент заданного типа T и возвращает объект типа TResult | Функция TResult (T arg) |
Принимает аргумент заданного типа T и делает что-то полезное (обычно с побочными эффектами) | действие аннулирования (T obj) |
Принимает аргумент заданного типа T и возвращает логическое значение (аналогично функции) | предикат bool(T obj) |
Вывод
С точки зрения Java, использование лямбд в API (например, Linq) довольно просто. Однако, если копнуть немного глубже, нужно понять некоторые тонкие различия. Я нахожу подход Java более простым, поскольку он не вводит другую концепцию, но подход C# более чистый, потому что делегат может быть вызван напрямую, как метод.
C# для разработчика Java (серия из 4 частей)
Оригинал: “https://dev.to/rnowif/c-for-the-java-developer-lambdas-1b6o”