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

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);
}

...

В 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()
);