Interface funcional Java 8 sem argumentos e sem valor de retorno


109

Qual é a interface funcional do Java 8 para um método que não leva nada e não retorna nada?

Ou seja, o equivalente ao C # sem parâmetros Actioncom voidtipo de retorno?

Respostas:


95

Se bem entendi, você quer uma interface funcional com um método void m(). Nesse caso, você pode simplesmente usar um Runnable.


29
RunnableA especificação da interface indica que ele deve fornecer código executável para a Threadclasse. Não me parece certo usar Runnableonde não se destina a execução por um encadeamento; parece enganoso. Runnableé definido como um FunctionalInterfaceporque atende às especificações de uma interface funcional e pode ser criado usando a sintaxe lambda. Por que não criar sua própria interface funcional? consulte Executável , consulte FunctionalInterface
TheSecretSquad

6
@TheSecretSquad (i) Runnableé anotado com @FunctionalInterfacee (ii) mesmo no contexto de uma expressão lambda, ele será executado em um thread: o thread em que o lambda é executado, que pode ser o thread atual ...
assylias 01 de

9
Concordo com @TheSecretSquad, embora satisfaça os requisitos funcionais, não parece muito semântico. Runnable é comumente associado à criação de threads. Uma interface funcional simples do Worker com um método doWork teria sido legal. EDITAR: Oops: stackoverflow.com/questions/27973294/…
jpangamarca

6
Revelando o "Oops" de @jpangamarca acima: Nos comentários sobre a pergunta duplicada que ele vinculou, Brian Goetz confirmou que a Runnableintenção era ser usada para este propósito, não apenas para contextos de discussão.
Joshua Goldberg

10
Dado que esse é o caso, porém, acho que o javadoc deve ser tornado mais genérico: docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html
Joshua Goldberg

15

Basta fazer o seu

@FunctionalInterface
public interface Procedure {
    void run();

    default Procedure andThen(Procedure after){
        return () -> {
            this.run();
            after.run();
        };
    }

    default Procedure compose(Procedure before){
        return () -> {
            before.run();
            this.run();
        };
    }
}

e usar assim

public static void main(String[] args){
    Procedure procedure1 = () -> System.out.print("Hello");
    Procedure procedure2 = () -> System.out.print("World");

    procedure1.andThen(procedure2).run();
    System.out.println();
    procedure1.compose(procedure2).run();

}

e a saída

HelloWorld
WorldHello

Eu realmente sinto, dado o ethos da pergunta, que esta deve ser a resposta aceita.
corsiKa

0

@FunctionalInterface permite apenas o método método abstrato Portanto você pode instanciar essa interface com a expressão lambda como abaixo e você pode acessar os membros da interface

        @FunctionalInterface
        interface Hai {

            void m2();

            static void m1() {
                System.out.println("i m1 method:::");
            }

            default void log(String str) {
                System.out.println("i am log method:::" + str);
            }

        }

    public class Hello {
        public static void main(String[] args) {

            Hai hai = () -> {};
            hai.log("lets do it.");
            Hai.m1();

        }
    }


output:
i am log method:::lets do it.
i m1 method:::
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.