sei que isso poderia render uma postagem específica, mas pelo menos já para deixar anotado, também é possível fazer a aplicação de callbacks para o Java, a partir de classes como o Consumer.
Consumer
Como indica a documentação, o consumer funcionaria como um callback de void e estruturado por lambda, no qual para executar seria algo como:
public static void main(String[] args)
{
long countVar = 0;
receivesCallback(countVar, num -> System.out.println(num += 1));
receivesCallback(countVar, num -> System.out.println(num += 2));
}
private static void receivesCallback(long count, Consumer<Long> callback)
{
callback.accept(count);
}
Também possuindo classes com mais parâmetros como o BiConsumer e TriConsumer:
Exemplo de BiConsumer:
public static void main(String[] args)
{
long countVar = 0;
long counterVar = 1;
receivesCallback(countVar, counterVar, (num, counter) -> System.out.println(num += counter));
receivesCallback(countVar, counterVar, (num, counter) -> System.out.println(num += (counter + 1)));
}
private static void receivesCallback(long count, long counter, BiConsumer<Long, Long> callback)
{
callback.accept(count, counter);
}
AInda teriam outras classes que funcionariam como um callback, como as classes Function ou Stream (com essa ultima funcionando para forEaches, filtros, etc), mas esses acredito que seria mais interessante dedicar a uma postagem mais completa.