인수 및 반환 값이없는 Java 8 기능 인터페이스


109

아무것도 취하지 않고 아무것도 반환하지 않는 메소드에 대한 Java 8 기능 인터페이스는 무엇입니까?

즉, C #을 매개 변수가에에 동등 Actionvoid리턴 타입?

답변:


96

내가 올바르게 이해하면 메소드와 기능적 인터페이스를 원합니다 void m(). 어떤 경우에는 간단히 Runnable.


29
Runnable의 인터페이스 사양은 Thread클래스에 실행 가능한 코드를 제공한다는 것을 나타냅니다 . Runnable스레드에 의해 실행되지 않는 곳 에서 사용 하는 것은 나에게 옳지 않은 것 같습니다 . 오해의 소지가있는 것 같습니다. 기능 인터페이스의 사양을 충족하고 람다 구문을 사용하여 생성 할 수 있기 때문에 Runnable로 정의됩니다 FunctionalInterface. 자신 만의 기능적 인터페이스를 만들어 보지 않겠습니까? Runnable 참조 , FunctionalInterface
TheSecretSquad

6
@TheSecretSquad (i) Runnable주석이 추가 @FunctionalInterface되고 (ii) 람다 표현식의 컨텍스트에서도 스레드에서 실행됩니다. 현재 스레드 일 수있는 람다가 실행되는 스레드 ...
assylias

9
@TheSecretSquad에 동의하지만 기능적 요구 사항을 충족하지만 의미 론적으로 들리지 않으며 Runnable은 일반적으로 스레드 생성과 관련이 있습니다. doWork 메서드가있는 간단한 작업자 기능 인터페이스가 좋았을 것입니다. 편집 : 죄송합니다 : stackoverflow.com/questions/27973294/…
jpangamarca

6
위의 @jpangamarca의 "Oops"구현 : 그가 연결 한 중복 질문에 대한 의견에서 Brian Goetz Runnable는 스레딩 컨텍스트뿐만 아니라 이러한 목적으로 사용되도록 의도 되었음을 확인했습니다 .
여호수아 골드버그


15

당신 만의

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

이렇게 사용하세요

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

}

및 출력

HelloWorld
WorldHello

질문의 기풍을 감안할 때 이것이 허용되는 대답이어야한다고 정말로 느낍니다.
corsiKa

0

@FunctionalInterface는 메서드 추상 메서드 만 허용하므로 아래와 같이 람다 식으로 해당 인터페이스를 인스턴스화 할 수 있으며 인터페이스 멤버에 액세스 할 수 있습니다.

        @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:::
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.