Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Momento de execução do método em Interface Funcional

Baseado em outra questão no fórum, tenho a seguinte dúvida:

É instanciado o MostraPrint e o método run é executado, mas em qual momento, já que explicitamente não chamamos o método, apenas instânciamos a classe MostraPrint?

public class Teste {

    public static void main(String[] args) {

        new Thread(new MostraPrint()).start();

    }
}
class MostraPrint implements Runnable{

    @Override
    public void run() {
        System.out.println("Executando um Runnable");

    }

}

Obrigado ;)

3 respostas

É porque você está instanciando a sua classe no construtor de uma Thread e chamando o método start(), daí ela chama o run() da classe MostraPrint. Por isso para utilizar uma classe em uma Thread é necessário implementar a interface Runnable, deste modo têm a garantia que o método run() será implementado.

Mas isso não só por ser uma Thread, no caso abaixo, como sei em qual momento o método apply é invocado? Eu estou instanciando uma Function mas em nenhum momento eu chamo o apply. Isso que está um pouco difícil de assimilar.

List<String> cursos = Arrays.asList("Java 8", "Javascript", "React");

        cursos.stream()
            .map(new Function<String, Integer>() {
                @Override
                public Integer apply(String curso) {
                    return curso.length();
                }
            })
            .forEach(strInteger -> System.out.println("Tamanho da texto: " + strInteger));
solução

Então, no primeiro exemplo da Thread se você for olhar na documentação:

Thread(Runnable target) Allocates a new Thread object.

Têm um construtor que aceita apenas objetos que implementam Runnable, ou seja, todas as classes implementam o método run(), que a Classe Thread utilizará para "Executar" a classe na thread.

Já no segundo exemplo:

Stream map(Function<? super T,? extends R> mapper)

O método recebe um objeto Function que implementa o método apply() que sua classe anônima está sobrescrevendo.

É como eu disse, o polimorfismo é utilizado para ter certeza que todo objeto passado terá o método que a classe precisa para funcionar, e isso pode ser notado nos dois casos.