Задать вопрос

Какие возможности современная Java предоставляет по эмуляции делегатов .NET?

Известно существование интерфейсов Runnable, Callable<V> — они не интересны потому, что либо полностью (в первом случае), либо практически полностью (за исключением типа возвращаемого значения во втором случае) фиксируют сигнатуру метода, который и хотелось бы обернуть в делегат.

Известны возможности Java в области создания внутренних классов, анонимных классов, замыканий методов таких классов. Но это всё не совсем то, чего хотелось бы — нет честных лямбд, нет делегатов в смысле .NET (ну и нет указателей на функции, честных шаблонов и прочего, что решает проблему в C++). Нужно что-то погибче вот такого.

Что известно хабросообществу на этот счет?
  • Вопрос задан
  • 5534 просмотра
Подписаться 7 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
orionll
@orionll
Мы используем вот такой подход:

interface Function0<T>
{
   T execute();
}

interface Function1<T, R>
{
    T execute(R arg1);
}

interface Function2<T, R1, R2>
{
    T execute(R1 arg1, R2 arg2);
}

interface Function3<T, R1, R2, R3>
{
    T execute(R1 arg1, R2 arg2, R3 arg3);
}

...
Ответ написан
kyberorg
@kyberorg
На данный момент известно, что в Java 8 будут лямбды.

Что касается функционала делегатов, то скорее всего в обозримом будущем такого не будет.
Я до конца не понимаю смысла делегатов в C#. Если это передача метода как аргумента, то возможно поможет java.reflection (например, метод forName).
Ответ написан
Откройте для себя Scala
Ответ написан
@avpmk
В Java 8 есть (в 2012 уже были (может и раньше не знаю)) лямбды, функциональные интерфейсы и указатели на методы (method reference).
Присваиваете функциональному интерфейсу (любому интерфейсу у которого только один абстрактный метод) лямбда выражение или methodReference c подходящей сигнатурой, другой код вызывает этот единственный метод..

Напримерно так:

java 8 (instance method)
Block<String> aFunctionalInterface = System.out::println;
Arrays.asList("А", "B", "C", "D", "E").forEach(aFunctionalInterface);

Predicate<String> p = "Строка"::equalsIgnoreCase;
System.out.println(p.test("СТРОКА"));
System.out.println(p.test("строкА"));
System.out.println(p.test("Другая строка"));

java 8 (static method)
System.out.println(
    Arrays.asList("А", "Bb", "Ccc", "Ddddddddddddd", "Eeee")
    .stream()
    .map(s -> s.length())
    .reduce(Math::max)
    .get()
);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы